1

我正在开发 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_

结果是

operator.or_ <built-in function 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)]
4

1 回答 1

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

不,您需要分别处理每个元素。

q_objects[type] = [Q(**{k: v}) for (k, v) in q_dict.iteritems()]
于 2011-11-15T16:07:00.467 回答