You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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可以两种方式实现,完全匹配你的需求:

  1. 默认别名写法
    先导入聚合函数:

    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('*')的默认别名。

  2. 自定义别名写法(更贴近你想要的输出)
    如果想把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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:12:53