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

use*_*147 14 python django django-queryset

我正在读这些问题

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

我无法得到这家运营商做的事情

filter(reduce(operator.or_, argument_list))

或这个

filter(reduce(operator.and_, query_list))

Yos*_*ssi 15

filter 是Django Model Manager的常规方法,因此无需解释.

reduce 是一个类似于下面的代码的内置函数:

def reduce(func, items):
    result = items.pop()
    for item in items:
        result = func(result, item)

    return result
Run Code Online (Sandbox Code Playgroud)

func用户定义的函数在哪里.

operator.or_是一个包装or运算符的python标准库函数.它与此代码类似:

def or_(a, b):
    return a | b
Run Code Online (Sandbox Code Playgroud)

例如:

reduce(operator.or_, [False, False, True])
Run Code Online (Sandbox Code Playgroud)

会回来True.

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


Tim*_*ony 5

Python 文档描述reduce为:

将两个参数的函数从左到右累积应用到 iterable 的项上,从而将 iterable 减少到单个值

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

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

例如,对于[Q(1), Q(2), Q(3)]我们想要首先OR Q(1)使用的查询Q(2),然后OR该操作的结果为Q3我们提供最终查询

我们习惯于看到 Python 中的操作(例如加法或减法)写成 like A + B(或在 or'ing: 的情况下A | B),但 Python 也提供了执行这些操作的函数(即or(a, b), 和and(a, b)它们会做同样的事情)。这些在此类情况下很有用,因为它们可以作为参数应用于其他方法。这些函数如“加”、“减”等都在operator模块中。

因此,使用该operators模块,我们看到它reduce(operator.and_, query_list)正在获取Q列表中的每个对象,并将其与列表中前一个对象的正在进行的结果“并”。