【问题标题】:How to use Q objects to test list membership?如何使用 Q 对象来测试列表成员资格?
【发布时间】:2013-05-31 19:23:21
【问题描述】:

使用普通的 Django 查询集,如果我想检索“a”属性为 1、2 或 3 的所有 myObjects,我会执行以下操作:

myObjects.objects.filter(a_in=[1,2,3])

但我想使用 Q 对象来做到这一点。如何使用 Q 对象编写等效查询?

【问题讨论】:

  • 不得不问,如果它与_in 合作,为什么要与Q 合作?
  • 在我看来,它应该可以立即工作。怎么了?
  • 好问题。在我的代码中,我对所有数据库访问都使用了常规查询集。然而,一些查询变得过于复杂,需要“或”操作,所以我不得不将它们切换到 Q 对象。为了可维护性和统一性,我想对所有数据库访问使用相同的技术。所以现在我用 Q 对象替换我所有的查询集。这还不够充分吗?
  • 嗯,不,这不是一个很好的理由,它不会增加任何可维护性。这是一个修复没有损坏的东西的案例。由于Q 对象的约定(正如您发现的那样,它对 or 查询很有用,因为大多数默认 API 是“和”查询)。

标签: python django django-q


【解决方案1】:

应该是这样的:

myObjects.objects.filter(Q(a = 1) | Q( a = 2) | Q( a = 3))

我不知道你为什么要这样做,但你也可以这样做

myObjects.objects.filter(Q(a__in=[1,2,3])

【讨论】:

    【解决方案2】:

    立即生效。

    Q(a__in=[1, 2, 3])
    

    可能您的问题是您使用的是单个下划线而不是两个。

    【讨论】:

      【解决方案3】:
      q = Q(a__in=[1,2,3])
      #q = Q(('a__in', [1,2,3]))
      myObjects.objects.filter(q)
      

      编辑:没关系,不需要元组。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-06-30
        • 2010-11-04
        • 1970-01-01
        • 2012-03-02
        • 2011-07-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多