Django 1.10.1
from django.db.models import Q
q = Q(title__icontains='r')
print(q)
>>> (AND: ('title__icontains', 'r'))
我只是想过是否可以使用OR逻辑操作创建相同的内容。
我可以像这样获得OR:
for item in q_objects:
query |= item
或其他方式(使用lamdba)。
但我不会感受到这个Q对象。这个问题可以帮助我更好地理解它。
换句话说,是否可以通过构造函数创建一个将显示的对象(OR :(' title__icontains',' r'))?
答案 0 :(得分:0)
哈克:
>>> Q.default = Q.OR
>>> q = Q(title__icontains='r')
>>> q
<Q: (OR: ('title__icontains', 'r'))>
不要这样做,因为你已经为任何未来(和现有的!)用户改变了Q类。
更有礼貌:
from django.db.models import Q
class MyQ(Q):
default = Q.OR
q = MyQ(title__icontains='r')
但是你现在有一个Q
子类的实例。这不应该是一个问题,实际上,这对于这些简单的对象来说实际上是不必要的。这是一种更先进的方式:
>>> from django.db.models import Q
>>> q = Q.__new__(Q)
>>> q.default = Q.OR
>>> q.__init__(title__icontains='r')
>>> q
<Q: (OR: ('title__icontains', 'r'))>
>>> Q.default # existing Q instances are unaffected
u'AND'
答案 1 :(得分:0)
为Q创建新对象似乎失败了,但您可以使用Q.default = Q.OR
修改默认连接器。
此外,您可以通过执行以下操作立即传递所有查询参数:
Model.objects.filter(Q(**query_dict))
# Make sure to use query dictionary taking note of the fact that simply using
# Double star operator would produce list values. You can do:
dictionary = dict(query_dict)
well_formed = {key: dictionary.get(key)[0] for key in dictionary.keys()}
result = Model.objects.filter(Q(**query_dict))