Django 系列博客(十二)
<h1 id="django-系列博客十二">Django 系列博客(十二) 本篇博客继续介绍 Django 中的查询,分别为聚合查询和分组查询,以及 F 和 Q 查询。 语法: # 计算所有图书的平均价格 from django.db.models import Avg Book.objects.all().aggregate(Avg('price')) aggregate()是 QuerySet 的一个终止子句,意思是说,它返回一个包含一些键值对的字典。键的名称是聚合值得标识符,值是计算出来的聚合值。建的名称是按照字段和聚合函数的名称自动生成出来的。如果你想要为聚合值指定个名称,可以向聚合子句提供它。 Book.objects.aggregate(average_price=Avg('price')) 如果你希望生成不止一个聚合值,你可以向 aggregate()子句中添加另一个参数。所以如果想知道所有图书价格的最大值和最小值,可以这样查询: from django.db.models import Avg,Max,Min Book.objects.aggregate(Avg('price'),Max('price'),Min('price')) 具体例子: # 查询所有书籍的平均价格 from django.db.models import Avg,Count,Min ret=Book.objects.all().aggregate(Avg('price')) # {'price__avg': 202.896} # 可以改名字 ret=Book.objects.all().aggregate(avg_price=Avg('price')) # 统计平均价格和最大价格 ret=Book.objects.all().aggregate(avg_price=Avg('price'),max_price=Max('price')) # 统计最小价格 ret = Book.objects.all().aggregate(avg_price=Avg('price'),min_price=Min('price')) # 统计个数和平均价格 ret = Book.objects.all().aggregate(avg_price=Avg('price'),max_price=Max('price'),count=Count('price')) ret = Book.objects.all().aggregate(avg_price=Avg('price'),count=Count('nid')) print(ret) 总结:
等价于 ret=Author.objects.all().annotate(s=Sum('bookprice')).filter(sgt=26).values('name','s') s相当于给求和结果取名字,在vlaues取值中,可以引用ret = Author.objects.all().annotate(s=Sum('price')).values('name','s') ret=Book.objects.all().values('pk').annotate(c=Count('authors')).filter(c__gt=1).values('name','c') print(ret) 等价于 ret = Book.objects.annotate(author_num=Count("authors")).filter(author_num__gt=1).values('name','author_num') |