尝试使用 operator.or_ 减少 Django Q 对象似乎会导致使用 'AND' 减少

Posted

技术标签:

【中文标题】尝试使用 operator.or_ 减少 Django Q 对象似乎会导致使用 \'AND\' 减少【英文标题】:Trying to reduce Django Q objects with operator.or_ seems to result in reduction with 'AND'尝试使用 operator.or_ 减少 Django Q 对象似乎会导致使用 'AND' 减少 【发布时间】:2011-12-29 15:34:55 【问题描述】:

我正在使用 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)]

【问题讨论】:

q_objects[key] 包含什么?只是想知道它是否已经有带有AND 的复合对象。因为当我尝试使用两个简单的 Q 对象时,我得到的结果与预期的 OR 相结合。 感谢您的回复。我在底部添加了其他信息。那里似乎没有类似“AND”的对象。 【参考方案1】:
q_objects[type] = [Q(**q_dict)]

没有。您需要分别处理每个元素。

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

【讨论】:

以上是关于尝试使用 operator.or_ 减少 Django Q 对象似乎会导致使用 'AND' 减少的主要内容,如果未能解决你的问题,请参考以下文章

delphi7报错: Missing operator or semicolon

Delphi中做加法,总显示错误missing operator or semicolon

django objects.filter Q() 在一个查询中可以使用多少次?

遍历模型字段 - Django

如何使用QueryStringQueryBuilder

减少共享内存库冲突