如何用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 cfannotate(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
相关产品推荐
相关产品推荐

