Q对象(一次创建OR连接类型)

时间:2016-10-05 20:55:30

标签: django

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'))?

2 个答案:

答案 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)

@ wim的答案太棒了! 只是一点点补充:

为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))