I have a interesting Django problem.
Consider the following:
Model.objects.filter(Q(id='test1') and Q(id='test2'))
this returns the expected results, however
Model.objects.filter(Q(id='test1') & Q(id='test2'))
DOES NOT!!
What's going on here?
If you want Django ORM to return test1 and test2, you should use :
Model.objects.filter(Q(id='test1') & Q(id='test2'))
means return model objects whose id is test1 while its is test2 at the same time. Of course, django will return an empty QuerySet.and is a boolean operator in Python. For operation
x and y
the result isif x is false, then x, else y
. ThusQ(id='test1') and Q(id='test2')
equalsQ(id='test1')
, it is not what you want.&/| is the the bitwise and/or operator.
BTW, there's no way to override the boolean operator, but you can override
&/|
operators in your class by define a method named__and__
/__or__
.below is the source code of the django Q object[github]:
according to the following tutorial
& is a Binary AND Operator copies a bit to the result if it exists in both operands.
Example: Assume if a = 60; and b = 13; Now in binary format they will be as follows:
a = 0011 1100
b = 0000 1101
(a & b) will give 12 which is 0000 1100
and Called Logical AND operator. If both the operands are true then then condition becomes true.
Example: (a and b) is true.
So the & was performing binary addition on your query set. Interesting.
I think you want
OR
here, and notAND