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

如何用Django ORM实现带group by和having的分组聚合查询

Django ORM 实现带HAVING的分组聚合查询方案

正确写法

首先导入依赖模块:

from django.db.models import Sum

对应需求的ORM查询语句如下:

Report.objects.filter(
    report_date=date_to
).values('cf').annotate(
    total_fee=Sum('fee')
).filter(total_fee__gt=500000)

原理解释

  • 第一层filter(report_date=date_to):对应SQL的WHERE report_date = '2021-11-01',先完成行级数据过滤
  • values('cf'):指定按cf字段分组,对应SQL的GROUP BY cf
  • annotate(total_fee=Sum('fee')):为每个分组计算fee字段的总和,将结果命名为total_fee,对应SQL的sum(fee)
  • 第二层filter(total_fee__gt=500000):由于是在annotate之后调用,Django会自动将该条件映射为SQL的HAVING子句,过滤聚合后总和大于500000的分组

常见误区说明

你之前的两种写法问题分别为:

  • 第一种仅完成了分组聚合逻辑,缺少对聚合结果的后置过滤
  • 第二种使用aggregate属于全局聚合方法,不会生成分组逻辑,仅返回全局聚合结果

内容的提问来源于stack exchange,提问作者Edoardo Zucchelli

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 06:24:03