【问题标题】:Django 3 - ORM "AND" logic in filteringDjango 3 - 过滤中的 ORM“AND”逻辑
【发布时间】:2021-07-07 02:07:00
【问题描述】:

我有一个问题。

qu = Product.objects 
        .filter(color = 'black')
        .filter(color = 'white')
        .all()

这给了我正在寻找的“与”逻辑。现在我想传递标准的字典。

my_crit = { 'color': 'black', 'color': 'white' }

    qu = Product.objects 
            .filter(**my_crit)
            .all()

这给了我 OR,这对我不利。所以我尝试了Q。

crit1 = Q(color='black')
crit2 = Q(color='white')

        qu = hello = Product.objects 
                .filter(crit1 & crit2)
                .all()

这将返回 0 个结果的查询。所以问题是 - 我如何使用带有动态输入的过滤器链(AND 逻辑)? (我自己的字典等)。

【问题讨论】:

  • 你试过getattr方法吗?
  • 不行,请问可以参考一下吗?
  • @Barrandov 首先{ 'color': 'black', 'color': 'white' } 你不能在同一个字典中有两次相同的键。其次crit1 & crit2这是一个不可能的条件,一个属性(color)怎么可能同时有两个不同的值(blackwhite)?谈到您的第一个查询,您似乎没有显示您的实际查询,您似乎与某个模型有许多关系,并且正在链接过滤器,这将为您提供您所谈论的行为。
  • 阿卜杜勒,谢谢你的回答。是的,我使用的是 M2M 模型。

标签: django django-orm


【解决方案1】:

您可以使用“__in”查找参数。

colors = ("black", "white")
queryset.filter(color__in=colors).all()

查看更多:https://docs.djangoproject.com/en/3.2/ref/models/querysets/#in

【讨论】:

  • 它不会创建“和”逻辑
  • 我不知道你有 m2m 关系,它看起来像一个普通的 CharField。您能否将模型添加到问题中?
猜你喜欢
  • 2018-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-07
  • 2019-10-21
  • 1970-01-01
  • 2014-06-23
相关资源
最近更新 更多