我正在阅读这些问题
Constructing Django filter queries dynamically with args and kwargs
我无法得到这个操作员做什么
filter(reduce(operator.or_, argument_list))
或者
filter(reduce(operator.and_, query_list))
答案 0 :(得分:15)
filter
是Django Model Manager的常规方法,所以无需解释。
reduce
是一个类似于以下代码的内置函数:
def reduce(func, items):
result = items.pop()
for item in items:
result = func(result, item)
return result
其中func
是用户定义的函数。
operator.or_
是一个包装or
运算符的python标准库函数。它与此代码类似:
def or_(a, b):
return a | b
例如:
reduce(operator.or_, [False, False, True])
将返回True
。
在您的示例上下文中,or
和and
运算符已超载,因此它应返回由or
或and
连接的较小部分组合的新查询操作
答案 1 :(得分:4)
The Python docs将reduce
描述为:
将可累积的两个参数的函数从左到右依次应用于iterable项,以便将iterable减少为单个值
因此,通过一个简单的函数调用,它允许我们通过一组数据轻松快速地执行单个函数(通过两个参数,即添加a到b)多次。
对于这个Django问题,我们想要通过获取单个查询(QuerySet
)对象的列表并累积执行Q
或{{来构建单个AND
对象1}}对它们进行操作以获得单个查询
例如,对于查询OR
,我们首先[Q(1), Q(2), Q(3)]
OR
Q(1)
,然后Q(2)
OR
Q3
1}}给我们最后的查询
我们习惯于看到python中的操作(例如加法或减法),如A + B
(或者在'或A | B
中),但是python还提供了执行这些操作的函数(即or(a, b)
和and(a, b)
,它们会做同样的事情)。这些在这些情况下很有用,因为它们可以作为参数应用于其他方法。这些函数如'add','subtract'等都在operator
模块中。
因此,使用operators
模块,我们看到reduce(operator.and_, query_list)
正在列出我们列表中的每个Q
对象,并且“和”将其与之前对象的持续结果相关联清单。