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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 17:39:54