Django中使用Prefetch预关联查询时无法汇总字段值的问题
解决Django关联字段销量汇总异常问题
嘿,我来帮你搞定这个销量汇总的坑!首先先提个小细节:你代码里的Sum('quantuty')是拼写错误,应该是Sum('quantity')——这个小失误可能也会影响你的汇总结果,先改过来哈。
回到核心问题:你现在的写法是给每条符合条件的Sales记录单独加了quantity_sold字段,但并没有按商品分组汇总。所以苹果的两条销量记录会各自返回自己的数值,而不是加总后的10。
这里给你两种靠谱的解决方案,按需选择:
方案一:直接在Product查询上做汇总(推荐)
这种方法最直接高效,直接在数据库层面完成分组和汇总,不需要额外处理prefetch的数据:
from django.db.models import Sum, Q # 给每个Product对象添加quantity_sold字段,汇总type为1、2的销量 products = Products.objects.annotate( quantity_sold=Sum( 'prod_sale__quantity', filter=Q(prod_sale__type__in=(1, 2)), # distinct=False确保所有符合条件的销量都被计入,默认就是False,可省略 distinct=False ) )
之后你直接访问product.quantity_sold就能拿到对应商品的总销量了——果汁是3,苹果就是10,完美符合预期。
方案二:调整Prefetch的查询逻辑(适合需要同时获取Sales记录的场景)
如果你不仅需要总销量,还得保留符合条件的Sales记录,那可以调整Prefetch里的queryset,先按商品分组汇总:
from django.db.models import Sum products = Products.objects.all().prefetch_related( Prefetch( 'prod_sale', # 先按product分组,再汇总销量 queryset=Sales.objects.filter(type__in=(1, 2)) .values('product') .annotate(quantity_sold=Sum('quantity')) .order_by(), # 去掉默认排序,避免冗余字段 to_attr='prod_sold' ) )
这种情况下,product.prod_sold会是一个包含字典的列表(每个字典有product和quantity_sold键),你可以通过product.prod_sold[0]['quantity_sold']拿到总销量。
两种方案里,方案一的性能和代码简洁度都更优,优先推荐使用哦!
内容的提问来源于stack exchange,提问作者Umar Milanzi Snr
相关产品推荐
相关产品推荐

