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