我读这个质疑请问这个操作在Django`减少(operator.and_,QUERY_LIST)指`
Constructing Django filter queries dynamically with args and kwargs
我不能够得到什么呢该运营商做
filter(reduce(operator.or_, argument_list))
或本
filter(reduce(operator.and_, query_list))
我读这个质疑请问这个操作在Django`减少(operator.and_,QUERY_LIST)指`
Constructing Django filter queries dynamically with args and kwargs
我不能够得到什么呢该运营商做
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
运营商连接起来。
我主要想知道的东西是'operator.and_'这是干什么的 – user194932147 2013-04-18 07:39:10
查看已更新的帖子。 – Yossi 2013-04-18 07:47:03
非常感谢!你用几行解释了几个例子不能说明的结果。results = items.pop()解释了为什么当我迭代对象列表并尝试减少该对象的属性时,我得到了有关类型的错误。 – 2017-07-11 18:32:12
The Python docs描述reduce
为:
应用的两个参数的函数累积到可迭代的项目,由左到右,从而减少可迭代为单个值
所以它允许我们通过一个简单的函数调用轻松快速地执行单个函数(这需要两个参数,即添加一个b)到一组数据上。
在这种Django的问题的情况下,我们希望通过采取单独的查询(Q
)对象的名单和他们累计执行AND
或OR
操作以获取单个查询
构建单个QuerySet
对象例如,对于查询[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
对象在我们的名单,而“AND'ing的”它在列表中的前对象的现有业绩。
是否有任何方法可以查看查询_list中Q obejcts的字符串表示形式,以查看构建的查询语句。当我在shell_plus中键入'query_list'时,它给了我一些id的Q对象。我想知道什么查询其建设 – user194932147 2013-04-18 08:02:32
在附注中,'reduce'现在是Python 3中的'functools.reduce' https://docs.python.org/3.0/library/functools.html#functools.reduce – wasabigeek 2017-03-01 04:58:25