阅读文本前请参考此文章的数据表结构
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
方法的顺序非常重要,会影响实际的查询效果:文章来源:https://www.toymoban.com/news/detail-428561.html
values
在annotate
的前面,Django会按照values
中指定的字段对Model对象进行分组,再对每个分组计算统计值,可以参照上述查询文章来源地址https://www.toymoban.com/news/detail-428561.html
到了这里,关于Django ORM 聚合查询和分组查询的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!