Django多表复杂过滤:统计指定支付类型的订单数量
Django多表过滤查询统计解决方案
你的示例代码中orders.filter(payment_methods = "credit")会报错,因为Orders模型不存在payment_methods字段。需要通过OrderPaymentMethods与Orders的反向关联关系来实现过滤统计,以下是几种可行方案:
方案一:基于已筛选的订单查询集扩展过滤
先筛选指定渠道的订单,再通过反向关联过滤支付类型,最后去重统计(避免同一订单多支付方式重复计数):
# 第一步:筛选渠道为Green_House的订单 orders = Orders.objects.filter(channel="Green_House") # 第二步:过滤关联支付类型为credit的订单并统计数量 method_count = orders.filter(orderpaymentmethods__payment_type="credit").distinct().count()
方案二:一次性组合查询(更高效)
直接在一次查询中同时指定渠道和支付类型条件,减少数据库交互:
method_count = Orders.objects.filter( channel="Green_House", orderpaymentmethods__payment_type="credit" ).distinct().count()
方案三:从支付方式模型出发查询
换个角度,先定位符合支付类型的记录,再关联订单渠道条件,最后按订单去重统计:
method_count = OrderPaymentMethods.objects.filter( payment_type="credit", fk_order__channel="Green_House" ).values("fk_order").distinct().count()
注:使用
distinct()是因为一个订单可能对应多条支付方式记录,确保每个订单只被统计一次。如果你的业务中一个订单仅对应一条支付方式记录,可以省略distinct()。
内容的提问来源于stack exchange,提问作者Bruno P
相关产品推荐
相关产品推荐

