尝试使用operator.or_减少Django Q对象似乎会导致'AND'减少 [英] Trying to reduce Django Q objects with operator.or_ seems to result in reduction with 'AND'

查看:222
本文介绍了尝试使用operator.or_减少Django Q对象似乎会导致'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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆