编程语言
首页 > 编程语言> > Python / Django-“ and”运算符和“&”运算符有什么区别

Python / Django-“ and”运算符和“&”运算符有什么区别

作者:互联网

我有一个有趣的Django问题.

考虑以下:

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

这将返回预期结果,但是

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

才不是!!

这里发生了什么?

解决方法:

如果您希望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.

在Python中是boolean operator.对于操作x和y,如果x为false,则结果为x,否则为y.因此,Q(id =’test1′)和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)
    ...

标签:python,django,operator-keyword
来源: https://codeday.me/bug/20191013/1905913.html