使用'和'并在Django ORM中使用'&'之间的区别

Mah*_*kur 5 python django django-orm

我有查询,显示不同的结果,当我使用&

criteria1 = Q(id__gte=802, id__lte=1000)
criteria2 = Q(country_id__contains='UK')
Run Code Online (Sandbox Code Playgroud)

我一直在使用:

q = Mymodel.objects.filter(criteria1 & criteria2)
Run Code Online (Sandbox Code Playgroud)

但在这个特殊情况下,当我使用& 它总是输出一行. (我也查了打印q.query(),查询出来就好了)

但是,当我使用不是&时.查询提供正确的输出

q = Mymodel.objects.filter(criteria1 and criteria2)
Run Code Online (Sandbox Code Playgroud)

引擎盖下究竟发生了什么?

awe*_*oon 2

正确的是criteria1 & criteria2. criteria1 and criteria2使用标准Python布尔逻辑并将被评估为criteria2,同时criteria1 & criteria2使用重载__and__方法并构造正确的复合Q对象:

In [1]: from django.db.models import Q                                                                                                                                                                                                                                                                                                                        

In [2]: criteria1 = Q(id__gte=802, id__lte=1000)                                                                                                                                                                                                                                                                                                              

In [3]: criteria2 = Q(country_id__contains='UK')                                                                                                                                                                                                                                                                                                              

In [4]: criteria1 & criteria2                                                                                                                                                                                                                                                                                                                                 
Out[4]: <Q: (AND: ('id__gte', 802), ('id__lte', 1000), ('country_id__contains', 'UK'))>

In [5]: criteria1 and criteria2                                                                                                                                                                                                                                                                                                                               
Out[5]: <Q: (AND: ('country_id__contains', 'UK'))>
Run Code Online (Sandbox Code Playgroud)