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

如何通过子表OrderItem关联查询父表m_Product并按商品名汇总订购数量

正确实现方案

优先从OrderItem表出发查询,逻辑更直接,因为所有订购记录都存在该表中,可避免关联查询无订购记录的商品。

前置依赖

首先需要导入Django的聚合函数Sum:

from django.db.models import Sum

最优实现(从OrderItem表查询)

# 过滤掉关联商品已被删除的记录,按商品名称分组统计总订购量
order_stat = OrderItem.objects.filter(
    product__isnull=False
).values(
    'product__name'
).annotate(
    total_quantity=Sum('quantity')
).order_by()

逻辑说明

  • filter(product__isnull=False):排除关联商品已被删除(外键置空)的无效订购记录
  • values('product__name'):指定按关联商品的名称分组,返回结果中会包含product__name字段
  • annotate(total_quantity=Sum('quantity')):对每个分组的订购数量求和,结果存储在total_quantity字段中
  • 末尾空order_by():清除模型默认排序字段的影响,避免额外字段被自动加入GROUP BY导致分组结果异常

可选实现(从m_Product表查询)

如果需要从商品表出发查询已被订购的商品统计,也可以用反向关联实现:

order_stat = m_Product.objects.filter(
    orderitem__isnull=False
).values(
    'name'
).annotate(
    total_quantity=Sum('orderitem__quantity')
).order_by()

原查询语句的问题

  • select_related仅支持正向外键、一对一关联的预查询,你从m_Product出发查反向一对多的OrderItem,用select_related本身不生效,反向关联预查询应该用prefetch_related
  • filter('name')语法错误,filter参数需要是符合规则的查询表达式(键值对形式),不能直接传入字段名字符串
  • values('quantity')选中的是m_Product自身的库存字段,不是OrderItem里的订购数量,求和对象错误
  • annotate(sum = Sum('quantity'))求和的是商品自身的库存字段,不是订购记录的数量,结果不符合预期

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 10:30:01