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

如何筛选所有变体库存均为0的Django Product模型数据

解决方案

要筛选出所有关联变体库存均为0的产品,你需要调整查询逻辑,排除存在库存大于0的变体的产品,或者通过聚合函数验证所有变体的库存最大值为0。以下是两种可行的实现方式:

方法一:排除法(推荐)

通过exclude排除所有存在库存>0的变体的产品,剩余的产品即为所有变体库存均为0的产品(若需排除无变体的产品,可额外添加计数筛选):

# 包含无变体的产品
Product.objects.exclude(variants__stock_quantity__gt=0)

# 仅保留有变体且所有变体库存为0的产品
from django.db.models import Count
Product.objects.annotate(variant_count=Count('variants')).exclude(variants__stock_quantity__gt=0).filter(variant_count__gt=0)

方法二:聚合最大值验证

通过Max聚合函数获取产品所有变体的最大库存值,若最大值为0,则说明所有变体库存均为0:

from django.db.models import Max

# 包含无变体的产品(无变体时max_stock为None)
Product.objects.annotate(max_stock=Max('variants__stock_quantity')).filter(max_stock=0)

# 仅保留有变体且所有变体库存为0的产品
Product.objects.annotate(max_stock=Max('variants__stock_quantity')).filter(max_stock__isnull=False, max_stock=0)

原代码问题说明

你原代码中存在两个问题:

  1. 误用了关联名称:模型中Variation的related_name是variants,但你代码里写的是variations,会导致字段不存在的错误。
  2. 筛选逻辑错误:filter(variants__stock_quantity=0)的逻辑是只要有一个变体库存为0就会选中该产品,而非所有变体都满足条件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 02:25:42