如何在Django中实现按cate_id分组求和的复杂SQL查询?
解决方案
首先,你之前的代码存在几个关键问题:
- 使用
aggregate()会返回全局汇总值,而非分组后的每条结果; distinct()和额外的annotate(record__category_id)属于冗余操作,分组逻辑未正确指定。
以下是两种符合需求的Django ORM实现方式,均能生成等价于你目标SQL(且更优化)的查询:
方式1:从Record模型出发查询
from django.db.models import Sum # 过滤指定用户的记录,按关联分类的cate_id和name分组,求和count queryset = Record.objects.filter(user=user).values( 'category__cate_id', 'category__name' ).annotate( count_sum=Sum('count') ).order_by('category__cate_id')
方式2:从Category模型反向关联查询
from django.db.models import Sum # 找到有指定用户记录的分类,按cate_id和name分组,求和关联记录的count queryset = Category.objects.filter( record__user=user ).values('cate_id', 'name').annotate( count_sum=Sum('record__count') ).order_by('cate_id')
结果获取
遍历查询集即可得到预期格式的数据:
for item in queryset: print(f"name: {item['name']}, count_sum: {item['count_sum']}")
说明
你的目标SQL中存在冗余的子查询B.cate_id IN (...),上述ORM写法已自动优化该逻辑——通过关联过滤直接确保只包含有对应用户记录的分类,同时按cate_id分组并完成求和,最终输出与你预期结果完全一致。
内容的提问来源于stack exchange,提问作者leo
相关产品推荐
相关产品推荐

