这个运算符在django`reduce(operator.and_,query_list)`中意味着什么

时间:2013-04-18 07:24:40

标签: python django django-queryset

我正在阅读这些问题

Constructing Django filter queries dynamically with args and kwargs

我无法得到这个操作员做什么

filter(reduce(operator.or_, argument_list))

或者

filter(reduce(operator.and_, query_list))

2 个答案:

答案 0 :(得分:15)

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_是一个包装or运算符的python标准库函数。它与此代码类似:

def or_(a, b):
    return a | b

例如:

reduce(operator.or_, [False, False, True])

将返回True

在您的示例上下文中,orand运算符已超载,因此它应返回由orand连接的较小部分组合的新查询操作

答案 1 :(得分:4)

The Python docsreduce描述为:

  

将可累积的两个参数的函数从左到右依次应用于iterable项,以便将iterable减少为单个值

因此,通过一个简单的函数调用,它允许我们通过一组数据轻松快速地执行单个函数(通过两个参数,即添加a到b)多次。

对于这个Django问题,我们想要通过获取单个查询(QuerySet)对象的列表并累积执行Q或{{来构建单个AND对象1}}对它们进行操作以获得单个查询

例如,对于查询OR,我们首先[Q(1), Q(2), Q(3)] OR Q(1),然后Q(2) OR Q3 1}}给我们最后的查询

我们习惯于看到python中的操作(例如加法或减法),如A + B(或者在'或A | B中),但是python还提供了执行这些操作的函数(即or(a, b)and(a, b),它们会做同样的事情)。这些在这些情况下很有用,因为它们可以作为参数应用于其他方法。这些函数如'add','subtract'等都在operator模块中。

因此,使用operators模块,我们看到reduce(operator.and_, query_list)正在列出我们列表中的每个Q对象,并且“和”将其与之前对象的持​​续结果相关联清单。