1.聚合查询
对QuerySet计算统计值,需要使用aggregate方法,提供的参数可以是一个或多个聚合函数
Django提供了一系列的聚合函数,其中Avg(平均值)、Count(计数)、Max(最大值)、Min(最小值)、Sum(加和)最为常用
要使用这些聚合函数,需要将它们引入当前的环境中:
from django.db.models import Avg, Count, Min, Max, Sum
首先得到id为1的Topic的Comment对象,之后,计算up值的加和。可以看到,字典结果的键名称是up__sum,这是Django根据字段名和聚合函数的名称自动拼接得到的:
comment = Comment.objects.filter(topic=1).aggregate(Sum('up')) return HttpResponse("Hello World!" + str(comment['up__sum']))
也可以给aggregate传递多个聚合函数:
comment = Comment.objects.filter(topic=1).aggregate(Sum('up'), Max('up')) return HttpResponse("Hello World!" + str(comment['up__sum']) + '---' + str(comment['up__max']))
2.分组查询
第二类统计是对QuerySet中的每一个Model对象都生成一个统计值,这可以通过annotate
方法完成
annotate
方法的使用过程与aggregate
是类似的,都需要传递聚合函数,来描述统计过程
统计每一个Topic对应的Comment的数量,利用annotate
可以这样实现:
topic = Topic.objects.annotate(Count('comment'))
如果想得到每一个Topic的所有Comment的up加和:
comment = Comment.objects.values('topic_id').annotate(Sum('up')).order_by() return HttpResponse("Hello World!" + str(comment[0]['up__sum']))
需要注意,annotate
和values
方法的顺序非常重要,会影响实际的查询效果:
values
在annotate
的前面,Django会按照values
中指定的字段对Model对象进行分组,再对每个分组计算统计值,可以参照上述查询