Django Q对象(立即使用或连接类型创建)

Django Q对象(立即使用或连接类型创建),django,Django,Django 1.10.1 from django.db.models import Q q = Q(title__icontains='r') print(q) >>> (AND: ('title__icontains', 'r')) 我刚刚在想,是否有可能创建相同的,但使用OR逻辑操作 我可以得到或像这样: for item in q_objects: query |= item 或者以其他方式(使用lamdba) 但我感觉不到这个问题。这个问题可能会帮助我更

Django 1.10.1

from django.db.models import Q
q = Q(title__icontains='r')

print(q)
>>> (AND: ('title__icontains', 'r'))
我刚刚在想,是否有可能创建相同的,但使用OR逻辑操作

我可以得到或像这样:

for item in q_objects:
    query |= item
或者以其他方式(使用lamdba)

但我感觉不到这个问题。这个问题可能会帮助我更好地理解它

换句话说,是否可以通过构造函数创建一个将显示(或:('title_uicontains','r'))的对象

哈奇:

>>> Q.default = Q.OR
>>> q = Q(title__icontains='r')
>>> q
<Q: (OR: ('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'
>>来自django.db.models import Q
>>>q=q.。\uuuu新的\uuuuu(q)
>>>q.default=q.OR
>>>q.uuu init_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
>>>q
>>>Q.default#现有的Q实例不受影响
u'AND'
哈奇:

>>> Q.default = Q.OR
>>> q = Q(title__icontains='r')
>>> q
<Q: (OR: ('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'
>>来自django.db.models import Q
>>>q=q.。\uuuu新的\uuuuu(q)
>>>q.default=q.OR
>>>q.uuu init_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
>>>q
>>>Q.default#现有的Q实例不受影响
u'AND'
@wim的答案太棒了!
只是一点补充:

为Q创建新对象似乎失败了,但您可以使用
Q.default=Q或
修改默认连接器

此外,您可以通过执行以下操作一次传递所有查询参数:

 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))
@维姆的答案太棒了! 只是一点补充:

为Q创建新对象似乎失败了,但您可以使用
Q.default=Q或
修改默认连接器

此外,您可以通过执行以下操作一次传递所有查询参数:

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

看起来很有希望。我必须消化。请给我点时间,看起来很有希望。我必须消化。请给我一些时间。