我正在阅读这个问题
用args和kwargs 动态构造Django过滤查询
我不知道这个操作员做什么
filter(reduce(operator.or_, argument_list))
或者这个
filter(reduce(operator.and_, query_list))
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_
是一个python标准库函数,它封装了or
运算符。它类似于这个代码:
def or_(a, b):
return a | b
例如:
reduce(operator.or_, [False, False, True])
将返回True
。
在您的示例上下文中,or
和and
运算符被重载,因此它应该返回一个由较小部分组成的新查询,所有这些部分都由or
或and
运算符连接。
Python文档将reduce
描述为:
将两个参数的函数从左到右累积应用于可迭代项,以便将可迭代项减少为单个值
因此,它允许我们通过一个简单的函数调用,在一组数据上轻松快速地多次执行单个函数(需要两个参数,即将a添加到b(。
在这个Django问题的情况下,我们希望通过获取单个查询(Q
(对象的列表并对它们累积执行AND
或OR
操作来构造单个QuerySet
对象,以获得单个查询
例如,对于查询[Q(1), Q(2), Q(3)]
,我们希望首先用Q(2)
来OR
Q(1)
,然后用Q3
来OR
该操作的结果,以给出我们的最终查询
我们习惯于在python中看到像A + B
一样编写的操作(如加法或减法((或者在or'ing:A | B
的情况下(,但python也提供了执行这些操作的函数(即or(a, b)
和and(a, b)
,它们会做同样的事情(。这些在这种情况下很有用,因为它们可以作为参数应用于其他方法。operator
模块中包含"加法"、"减法"等功能。
因此,使用operators
模块,我们可以看到reduce(operator.and_, query_list)
正在获取列表中的每个Q
对象,并将其与列表中先前对象的正在进行的结果"相加"。