我读这个问题
用指定参数和kwargs动态构建的Django过滤器的查询
我没能获得该运营商做什么呢
filter(reduce(operator.or_, argument_list))
或这个
filter(reduce(operator.and_, query_list))
我读这个问题
用指定参数和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_
是一个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的情况下,我们要建立一个单一QuerySet
采取单个查询(列表对象Q
)对象和累计执行AND
或OR
对他们的操作以获取单个查询
例如,对于查询[Q(1), Q(2), Q(3)]
我们想OR
Q(1)
与Q(2)
然后再OR
与操作的结果Q3
给我们我们的最终查询
我们看惯这样写在python操作(例如加或减) A + B
(或在的OR'ing的情况下: A | B
),但也蟒提供函数来执行这些(即or(a, b)
,并and(a, b)
这将做同样的事情)。 这些是在诸如这些的情况下是有用的,因为它们可以作为参数的其它方法来施加。 这些功能,诸如“添加”,“减去”等是在operator
模块。
因此,使用该operators
模块,我们可以看到, reduce(operator.and_, query_list)
正在各Q
对象在我们的名单,而“AND'ing的”它在列表中的前对象的现有业绩。