如何通过子表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_relatedfilter('name')语法错误,filter参数需要是符合规则的查询表达式(键值对形式),不能直接传入字段名字符串values('quantity')选中的是m_Product自身的库存字段,不是OrderItem里的订购数量,求和对象错误annotate(sum = Sum('quantity'))求和的是商品自身的库存字段,不是订购记录的数量,结果不符合预期
内容的提问来源于stack exchange,提问作者Molla
相关产品推荐
相关产品推荐

