я читаю эти вопросы
Динамическое построение запросов фильтра Django с помощью args и kwargs< /а>
Я не могу понять, что делает этот оператор
filter(reduce(operator.or_, argument_list))
или это
filter(reduce(operator.and_, query_list))
я читаю эти вопросы
Динамическое построение запросов фильтра Django с помощью args и kwargs< /а>
Я не могу понять, что делает этот оператор
filter(reduce(operator.or_, argument_list))
или это
filter(reduce(operator.and_, query_list))
reduce
теперь functools.reduce
в Python 3 docs.python. org/3.0/library/functools.html#functools.reduce 01.03.2017 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
.
В контексте вашего примера операторы or
и and
перегружены, и поэтому он должен возвращать новый запрос, состоящий из более мелких частей, объединенных оператором or
или and
.
Документация Python описывает reduce
как:
Применение функции двух аргументов кумулятивно к элементам итерации слева направо, чтобы уменьшить итерацию до одного значения.
Таким образом, это позволяет нам легко и быстро выполнять одну функцию (которая принимает два параметра, т. е. добавлять a к b) множество раз над набором данных с помощью одного простого вызова функции.
В случае этой проблемы Django мы хотим построить один объект QuerySet
, взяв список отдельных объектов запроса (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
в нашем списке и объединяет его с текущими результатами предыдущих объектов в списке.
query_list
в shell_plus, он дает мне объект Q с некоторым идентификатором. я хочу знать, какой запрос его здания 18.04.2013
operator.and_
что это делает 18.04.2013