尝试用operator.or_减少Django Q对象似乎结果为'AND'的减少

1 投票
1 回答
1741 浏览
提问于 2025-04-17 06:22
operator.or_ <built-in function or_>

我正在用Python/Django开发一个应用程序。我想通过使用Python的operator.or_函数来过滤一组Q对象,减少这个列表的大小。可惜的是,结果是一个用AND连接的列表,而不是用operator.or_连接的。

问题出现在以下代码中:

print 'operator.or_', operator.or_
filter = reduce(operator.or_, q_objects[key])
print key, '->', filter

这段代码的结果是

print 'operator.or_', operator.or_

看起来是成功的。

但是,

filter = reduce(operator.or_, q_objects[key])
print key, '->', filter    

结果是(加了格式化)

some_key -> (
        AND: 
        ('some_field__icontains', u'search string 1'), 
        ('other_field__icontains', u'search string 2')
    )

如你所见,结果是用AND连接的,而不是OR。有没有人能看出我哪里做错了?

关于q_objects[key],它是这样创建的:

q_dict = {'some_field__icontains': u'search string 1', 'other_field__icontains': u'search string 2'}
q_objects[key] = [Q(**q_dict)]

1 个回答

2
q_objects[type] = [Q(**q_dict)]

不行。你需要单独处理每个元素。

q_objects[type] = [Q(**{k: v}) for (k, v) in q_dict.iteritems()]

撰写回答