Django中annotate后group by失效,如何按org_slug统计指定订单成本总和?
解决Django按org_slug分组统计特定订单成本总和的问题
你的需求是按org_slug分组,统计每个分组里仅关联1条ProductToOrder记录且该记录qty=1的订单的成本总和。原查询的问题出在子查询逻辑错误——子查询里的Sum('producttoorder__qty')是把整个org_slug下所有订单的qty累加,而非判断单个订单的关联条件,导致分组过滤失效,返回了所有订单的结果。
这里提供两种简洁的解决方案:
方案一:从Order模型出发查询
from django.db.models import Count, Sum, Q # 先筛选符合条件的订单,再按org_slug分组统计 result = Order.objects.filter( some_filter_here, # 保留你的原有过滤条件 # 先过滤出关联的ProductToOrder有qty=1的订单 Q(producttoorder__qty=1) ).annotate( # 统计每个订单关联的ProductToOrder数量 product_count=Count('producttoorder') ).filter( # 确保每个订单仅关联1条ProductToOrder记录 product_count=1 ).values('org_slug').annotate( # 按org_slug分组,统计符合条件的订单的成本总和 total_cost=Sum('producttoorder__cost') ).order_by('org_slug')
逻辑说明:
- 先用
Q(producttoorder__qty=1)过滤出关联记录有qty=1的订单; - 通过
Count('producttoorder')统计每个订单的关联记录数,再筛选出仅关联1条的订单; - 最后按
org_slug分组,用Sum计算该分组下所有符合条件订单的成本总和。
方案二:从ProductToOrder模型出发查询(更高效)
如果数据量较大,从关联表出发查询可能更高效:
from django.db.models import Sum, Count result = ProductToOrder.objects.filter( qty=1, # 关联的Order满足你的原有过滤条件 order__some_filter_here ).annotate( # 统计当前ProductToOrder所属订单的关联记录总数 order_product_count=Count('order__producttoorder') ).filter( # 确保该订单仅关联1条ProductToOrder记录 order_product_count=1 ).values('order__org_slug').annotate( # 按org_slug分组统计成本总和 total_cost=Sum('cost') ).order_by('order__org_slug')
逻辑说明:
- 直接过滤出qty=1的ProductToOrder记录;
- 统计每条记录所属订单的关联记录总数,筛选出仅关联1条的情况;
- 按订单的
org_slug分组,累加成本得到结果。
这两种方案都能得到你期望的每个org_slug一条的统计结果,不需要新增模型字段。
内容的提问来源于stack exchange,提问作者User Dev
相关产品推荐
相关产品推荐

