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

Django使用raw查询MySQL时SUM函数无法正确求和的问题

问题原因
  • 主键字段冲突:你的SELECT语句包含了模型主键id,但分组查询(GROUP BY)后每个分组对应多条原始数据,id是单条数据的唯一标识,MySQL会返回分组内任意一条数据的id;而Django的raw()方法会将结果映射为PqList模型实例,这种主键混乱会导致字段映射出错,无法正确识别聚合后的SUM(quantity)值。
  • 聚合字段无别名:SUM(quantity)未指定别名,Django无法将这个聚合值绑定到模型的对应属性(模型中不存在名为SUM(quantity)的字段),最终获取到的可能是分组内某条数据的quantity值,而非求和结果。
解决方法

方法一:修正RAW查询语句

移除不必要的id字段,给聚合字段添加别名,确保Django能正确映射:

yesterday = date.today() - timedelta(days=1)
# 去掉id,给SUM(quantity)设置别名sum_quantity
list_parts = PqList.objects.raw('SELECT SUM(quantity) AS sum_quantity, equipment_id, so_number FROM pq_list WHERE date > %s GROUP BY equipment_id, so_number', [yesterday])
context['list_parts'] = list_parts

后续可通过item.sum_quantity在代码或模板中获取求和结果。

方法二:使用Django ORM聚合查询(推荐)

尽量避免直接使用raw(),用Django原生ORM方法更安全且符合框架规范:

from django.db.models import Sum

yesterday = date.today() - timedelta(days=1)
list_parts = PqList.objects.filter(date__gt=yesterday)\
    .values('equipment_id', 'so_number')\
    .annotate(sum_quantity=Sum('quantity'))\
    .order_by('equipment_id', 'so_number')
context['list_parts'] = list_parts

查询结果为字典列表,每个字典包含equipment_id、so_number和sum_quantity,可直接通过键名在模板或代码中访问。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 15:45:42