如何在Django中按可用状态及子表颜色数量对产品查询排序?
问题解决:按available状态和关联颜色数量排序Product模型
问题背景
现有Product与ProductColor模型关联(ProductColor通过外键关联Product,related_name为colors),需求是:
- 先按
Product的available字段降序排序(可用产品在前) - 再按每个产品关联的颜色数量从多到少排序
之前的尝试未实现需求,以下是正确解决方案:
解决方案
1. 统计所有关联颜色数量
如果需求是统计产品关联的所有颜色条目数量(不管颜色的quantity是否为0),直接用Count注解统计colors关联的记录数,再按指定规则排序:
from django.db.models import Count # 先注解颜色数量,再排序 products = Product.objects.annotate( color_count=Count('colors') ).order_by('-available', '-color_count')
2. 统计有库存的颜色数量
如果需求是只统计**quantity>0的有效颜色数量**,需要给Count添加过滤条件:
from django.db.models import Count, Q products = Product.objects.annotate( color_count=Count('colors', filter=Q(colors__quantity__gt=0)) ).order_by('-available', '-color_count')
原代码问题说明
你之前的代码用Case/When注解的是has_zero_quantity,这是在判断是否存在库存为0的颜色,和统计颜色总数的需求不符,所以无法实现按颜色数量排序的目标。
内容的提问来源于stack exchange,提问作者Pourya Mohamadi
相关产品推荐
相关产品推荐

