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