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

如何编写满足关联模型多OR条件的Django ORM查询语句

你可以通过Django的Q对象构造多条件或逻辑查询,搭配注解或者子查询实现需求,以下是两种可行方案:

方案1:注解+跨表查询(写法简单,适合中小数据量)

首先导入需要的工具:

from django.db.models import Count, Max, Q

查询代码如下:

queryset = Order.objects.annotate(
    # 统计关联Product总数
    products_count=Count('products'),
    # 统计关联Product的quantity最大值,大于1即代表至少有一个Product满足条件
    max_quantity=Max('products__quantity')
).filter(
    # 三个条件任意满足一个即可
    Q(products_count__gt=1) |
    Q(max_quantity__gt=1) |
    Q(products__b_product__type='rtProduct')
).distinct()

末尾添加distinct()是为了避免跨表查询时,同一个Order关联多个符合条件的Product导致返回重复实例。

方案2:子查询(性能更优,适合大数据量表)

如果你的业务数据量较大,使用Exists子查询的性能会更高,且不需要额外去重:

from django.db.models import Count, Q, Exists, OuterRef

# 提前构造子查询,查询当前Order是否存在符合条件的Product
has_quantity_gt1 = Exists(
    Product.objects.filter(order=OuterRef('pk'), quantity__gt=1)
)
has_rt_product = Exists(
    Product.objects.filter(order=OuterRef('pk'), b_product__type='rtProduct')
)

queryset = Order.objects.annotate(
    products_count=Count('products')
).filter(
    Q(products_count__gt=1) | has_quantity_gt1 | has_rt_product
)

内容的提问来源于stack exchange,提问作者DarK_FirefoX

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 05:57:02