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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 06:10:32