请问这个操作在Django`减少(operator.and_,QUERY_LIST)表示`(what

2019-08-31 11:00发布

我读这个问题

用指定参数和kwargs动态构建的Django过滤器的查询

我没能获得该运营商做什么呢

filter(reduce(operator.or_, argument_list))

或这个

filter(reduce(operator.and_, query_list))

Answer 1:

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运营商。



Answer 2:

Python文档描述reduce为:

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

因此,它可以让我们轻松,快速地执行单一功能(它有两个参数,即添加a到b)在一组有一个简单的函数调用数据的无数次。

在这个问题的Django的情况下,我们要建立一个单一QuerySet采取单个查询(列表对象Q )对象和累计执行ANDOR对他们的操作以获取单个查询

例如,对于查询[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的”它在列表中的前对象的现有业绩。



文章来源: what does this operator means in django `reduce(operator.and_, query_list)`