如何在Django中为父产品查询集注释自身与子产品的库存总和?
问题分析与解决方案
首先你的方案不可行,存在两个明显问题:
- 语法错误:
values_list是方法,应该用values_list('stock')调用,而非values_list['stock']这种索引写法 - 性能隐患:就算修正语法,这种写法会生成相关子查询——数据库会为每个父产品单独执行一次子查询来统计子产品库存总和,父产品数量越多,查询次数就越多,会产生大量数据库请求,性能很差。
正确实现方式
利用Django的反向关联特性,直接通过product_set__stock关联子产品的库存字段,配合Sum和F表达式实现单次查询完成计算,同时用Coalesce处理没有子产品的情况(避免Sum返回None导致加法错误):
from django.db.models import Sum, F, Coalesce # 筛选父产品,annotate计算自身库存+所有子产品库存总和 qs = Product.objects.filter(is_parent=True).annotate( stock_sum=F('stock') + Coalesce(Sum('product_set__stock'), 0) )
性能说明
这个写法会让Django生成一条包含LEFT JOIN的SQL语句,只需要一次数据库查询就能完成所有父产品的库存总和计算,不会产生额外的查询请求,性能高效。
内容的提问来源于stack exchange,提问作者Gustavo William
相关产品推荐
相关产品推荐

