这个运算符在django中的含义是reduce(operator.and_,query_list)



我正在阅读这个问题

用args和kwargs 动态构造Django过滤查询

我不知道这个操作员做什么

filter(reduce(operator.or_, argument_list))

或者这个

filter(reduce(operator.and_, query_list))

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_是一个python标准库函数,它封装了or运算符。它类似于这个代码:

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

例如:

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

将返回True

在您的示例上下文中,orand运算符被重载,因此它应该返回一个由较小部分组成的新查询,所有这些部分都由orand运算符连接。

Python文档将reduce描述为:

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

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

在这个Django问题的情况下,我们希望通过获取单个查询(Q(对象的列表并对它们累积执行ANDOR操作来构造单个QuerySet对象,以获得单个查询

例如,对于查询[Q(1), Q(2), Q(3)],我们希望首先用Q(2)OR Q(1),然后用Q3OR该操作的结果,以给出我们的最终查询

我们习惯于在python中看到像A + B一样编写的操作(如加法或减法((或者在or'ing:A | B的情况下(,但python也提供了执行这些操作的函数(即or(a, b)and(a, b),它们会做同样的事情(。这些在这种情况下很有用,因为它们可以作为参数应用于其他方法。operator模块中包含"加法"、"减法"等功能。

因此,使用operators模块,我们可以看到reduce(operator.and_, query_list)正在获取列表中的每个Q对象,并将其与列表中先前对象的正在进行的结果"相加"。

相关内容

  • 没有找到相关文章

最新更新