Django 2.0中能否通过ORM同时执行Aggregate Sum与Count查询?
Django 2.0中用ORM实现SUM和COUNT(*)聚合的正确姿势
嘿,刚好踩过类似的坑,来给你明确解答:
Django 2.0完全支持你想要的ORM语法,而且不需要额外添加查询语句,你的困惑其实是对Count()函数的使用场景误解啦——它可不只用来统计外键关联数据,和SQL里的COUNT(*)一样,它能直接统计当前查询集的总记录数。
对应SQL的ORM写法
你的目标SQL是:
SELECT sum(project_shares) as shares, count(*) as count FROM vv_projects
用Django ORM可以两种方式实现,完全匹配你的需求:
默认别名写法
先导入聚合函数:from django.db.models import Sum, Count然后执行聚合查询:
result = Projects.objects.aggregate(Sum('project_shares'), Count('*'))这时候返回的结果就是:
{'project_shares_sum': 9, 'count': 8}其中
project_shares_sum是Sum('project_shares')的默认别名(字段名+_sum后缀),count是Count('*')的默认别名。自定义别名写法(更贴近你想要的输出)
如果想把project_shares_sum改成shares,直接给聚合函数指定关键字参数即可:result = Projects.objects.aggregate(shares=Sum('project_shares'), count=Count('*'))这样返回的结果就完全符合你的预期:
{'shares': 9, 'count': 8}
为什么这能行?
Django的aggregate()方法会把所有指定的聚合函数打包成一条SQL查询执行,和你手动写的SQL逻辑完全一致——不会拆分多次查询,性能和原生SQL一样高效。Count('*')在这里的作用就是统计vv_projects表的总记录数,和外键关联场景的用法只是不同场景下的应用,本质都是聚合统计。
内容的提问来源于stack exchange,提问作者Sayok88
相关产品推荐
相关产品推荐

