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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 19:05:24