尝试使用operator.or_减少Django Q对象似乎会导致'AND'减少 [英] Trying to reduce Django Q objects with operator.or_ seems to result in reduction with 'AND'
问题描述
我正在使用Python/Django开发一个应用程序.我试图通过使用Python的operator.or_函数减少Q对象的列表来进行过滤.
不幸的是,它导致列表与AND
而不是operator.or_
组合.
此问题出现在以下代码中:
I am working on an application in Python/Django. I am trying to make a filter by reducing a list of Q objects with Python's operator.or_ function.
Unfortunately it results in a list that is combined with an AND
rather than operator.or_
.
The problem occurs in the following code:
print 'operator.or_', operator.or_
filter = reduce(operator.or_, q_objects[key])
print key, '->', filter
声明
print 'operator.or_', operator.or_
结果
operator.or_ <built-in function or_>
所以看起来成功了. 但是,
so that seems succesful. However,
filter = reduce(operator.or_, q_objects[key])
print key, '->', filter
产生(带有添加的格式)
results in (with added formatting)
some_key -> (
AND:
('some_field__icontains', u'search string 1'),
('other_field__icontains', u'search string 2')
)
如您所见,结果具有AND
而不是OR
.
有人可以看到我在做什么错吗?
As you can see, the result has an AND
rather than an OR
.
Can anyone see what I am doing wrong?
关于q_objects[key]
,它的创建过程如下:
Regarding q_objects[key]
, it is created as follows:
q_dict = {'some_field__icontains': u'search string 1', 'other_field__icontains': u'search string 2'}
q_objects[key] = [Q(**q_dict)]
推荐答案
q_objects[type] = [Q(**q_dict)]
不.您需要分别处理每个元素.
No. You need to handle each element separately.
q_objects[type] = [Q(**{k: v}) for (k, v) in q_dict.iteritems()]
这篇关于尝试使用operator.or_减少Django Q对象似乎会导致'AND'减少的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!