14

我正在阅读这个问题

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

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

filter(reduce(operator.or_, argument_list))

或这个

filter(reduce(operator.and_, query_list))

4

2 回答 2

16

filter是django模型管理器的常规方法,所以没什么好解释的。

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

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

于 2013-04-18T07:34:50.623 回答
5

Python 文档描述reduce为:

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

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

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

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

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

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

于 2013-04-18T07:59:11.393 回答