2013-04-18 55 views

回答

14

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

在你的榜样背景下,orand符重载,因此它应该返回一个新的查询相结合的更小的部分全部由orand运营商连接起来。

+0

我主要想知道的东西是'operator.and_'这是干什么的 – user194932147 2013-04-18 07:39:10

+0

查看已更新的帖子。 – Yossi 2013-04-18 07:47:03

+0

非常感谢!你用几行解释了几个例子不能说明的结果。results = items.pop()解释了为什么当我迭代对象列表并尝试减少该对象的属性时,我得到了有关类型的错误。 – 2017-07-11 18:32:12

4

The Python docs描述reduce为:

应用的两个参数的函数累积到可迭代的项目,由左到右,从而减少可迭代为单个值

所以它允许我们通过一个简单的函数调用轻松快速地执行单个函数(这需要两个参数,即添加一个b)到一组数据上。

在这种Django的问题的情况下,我们希望通过采取单独的查询(Q)对象的名单和他们累计执行ANDOR操作以获取单个查询

构建单个QuerySet对象例如,对于查询[Q(1), Q(2), Q(3)]我们要ORQ(1)Q(2)第一,然后用ORQ3操作的结果给我们我们的最终查询

我们见惯python中的操作(例如加法或减法)如A + B(或or'ing:A | B),但是python也提供了执行这些操作的函数。 or(a, b)and(a, b),它们会做同样的事情)。这些在这些情况下很有用,因为它们可以用作其他方法的参数。这些功能,如'添加','减'等在operator模块。

因此,使用operators模块,我们可以看到,reduce(operator.and_, query_list)正在各Q对象在我们的名单,而“AND'ing的”它在列表中的前对象的现有业绩。

+0

是否有任何方法可以查看查询_list中Q obejcts的字符串表示形式,以查看构建的查询语句。当我在shell_plus中键入'query_list'时,它给了我一些id的Q对象。我想知道什么查询其建设 – user194932147 2013-04-18 08:02:32