Django添加Q过滤器以查询相关对象存在时,条件查询

Posted

技术标签:

【中文标题】Django添加Q过滤器以查询相关对象存在时,条件查询【英文标题】:Django Add Q filters to query when related object exists, Conditional query 【发布时间】:2020-06-19 15:13:29 【问题描述】:

我正在尝试这样查询我的产品型号:

我有与用户相关的产品模型 我的用户可以有一个相关的商店,它的商店可以是非活动的或不可见的

因此,我的产品可以由拥有商店的用户或没有商店的用户销售;我想要做的是在 "has_store" 条件像这样为 True 时添加这些额外参数的查询。

   store_query = ("seller__user_store__is_active": True,
                  "seller__user_store__is_visible": True
                 if F("seller__user_store__isnull=False") else )

然后将该查询添加到我的过滤语句中:

   Product.objects.filter(Q(is_new=True) & Q(is_active=True), **store_query)

我的产品模型还有is_newis_active等参数。 因此,如果产品卖家有相关商店,则预期行为类似于添加 Q(seller__user_store__is_visible=True)Q(seller__user_store__is_active=True)

我希望已经清楚了,非常感谢你

【问题讨论】:

【参考方案1】:

我认为你把事情弄得太复杂了。 stored_query 就相当于:

Q(seller__user_store=None) | Q(seller__user_store__is_active=True, seller__user_store__is_visible=True)

确实,万一seller__user_store=None,就不用看卖家的条件了,不然会的。因此,我们可以将其实现为:

Product.objects.filter(
    Q(seller__user_store=None) | Q(seller__user_store__is_active=True, seller__user_store__is_visible=True),
    is_new=True, is_active=True
)

【讨论】:

以上是关于Django添加Q过滤器以查询相关对象存在时,条件查询的主要内容,如果未能解决你的问题,请参考以下文章

Django Q过滤器,无法在单个查询中获得结果

Django ORM数据库查询操作

Django ORM数据库查询操作

Django 结合两个没有 Q 的查询

Django:为相关表构建动态 Q 查询

Django-create 过滤器基于使用 Q 对象和 if elif 条件的每个字段