【问题标题】:Python/Django -- what is the difference between the "and" operator and the "&" operatorPython/Django——“and”操作符和“&”操作符有什么区别
【发布时间】:2013-10-25 01:00:29
【问题描述】:

我有一个有趣的 Django 问题。

考虑以下几点:

Model.objects.filter(Q(id='test1') and Q(id='test2'))

这会返回预期的结果,但是

Model.objects.filter(Q(id='test1') & Q(id='test2'))

没有!!

这是怎么回事?

【问题讨论】:

标签: python django operator-keyword


【解决方案1】:

如果你想让 Django ORM 返回 test1 和 test2,你应该使用:

Model.objects.filter(Q(id='test1') | Q(id='test2'))

Model.objects.filter(Q(id='test1') & Q(id='test2')) 表示返回 id 为 test1 而同时为 test2 的模型对象。当然,django 会返回一个空的 QuerySet。

and 在 Python 中是 boolean operator。对于操作x and y,结果为if x is false, then x, else y。因此Q(id='test1') and Q(id='test2') 等于Q(id='test1'),这不是你想要的。

&/|bitwise and/or operator

顺便说一句,没有办法覆盖布尔运算符,但您可以通过定义名为 __and__ / __or__ 的方法来覆盖类中的 &/| 运算符。

下面是django Q object[github]的源码:

class Q(tree.Node):
    """
    Encapsulates filters as objects that can then be combined logically (using
    & and |).
    """
    # Connection types
    AND = 'AND'
    OR = 'OR'
    default = AND

    def __or__(self, other):
        return self._combine(other, self.OR)

    def __and__(self, other):
        return self._combine(other, self.AND)
    ...

【讨论】:

    【解决方案2】:

    根据以下tutorial

    & 是一个二进制 AND 运算符,如果它在两个操作数中都存在,则将一个位复制到结果中。

    示例: 假设 a = 60;和 b = 13;现在以二进制格式显示如下:

    a = 0011 1100

    b = 0000 1101

    (a & b) 将给出 12,即 0000 1100

    and 称为逻辑与运算符。如果两个操作数都为真,则条件为真。

    示例:(a 和 b) 为真。

    所以 & 正在对您的查询集执行二进制加法。很有趣。

    【讨论】:

    • 好的,所以我的主要问题是我有一个搜索参数列表,我需要从列表中动态创建一个 (Q(one) 和 Q(two)) [一,二] .我不能使用 reduce(operator.and_, Q(i) for i in LIST)) 因为 and_ 是按位的!!!那我该怎么办??
    • 我的 django 知识仍然非常有限,但这个 question 看起来与您所寻找的相似。抱歉,我无法提供更多帮助。祝你好运!
    【解决方案3】:

    我想你在这里想要OR,而不是AND

    filters = ['test1', 'test2', 'test3', 'test4']
    filtered = Model.objects.filter(Q(id = filters[0]))
    for f in filters[1:]:
         subset = Model.objects.filter(Q(id = f))
         filtered = filtered | subset
    

    【讨论】:

      猜你喜欢
      • 2022-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-05
      相关资源
      最近更新 更多