The Python docs beschreiben reduce
wie:
eine Funktion von zwei Argumenten Anwenden kumulativ auf die Elemente von iterable, von links nach rechts, um die iterable auf einen einzelnen Wert
So zu reduzieren es erlaubt uns, einfach und schnell eine einzelne Funktion (die zwei Parameter benötigt, dh a zu b addieren) mit einem einfachen Funktionsaufruf mehrmals über eine Datenmenge durchzuführen.
Im Falle dieses Django Problem, wir wollen, indem sie eine Liste der einzelnen Abfrage (Q
) Objekte und kumulativ Durchführung eines AND
oder OR
Betrieb auf sie ein einzelnes QuerySet
Objekt konstruieren, eine einzelne Abfrage
zu erhalten zum Beispiel für die Abfragen [Q(1), Q(2), Q(3)]
wollen wir OR
Q(1)
mit Q(2)
zuerst, und dann OR
das Ergebnis dieser Operation mit Q3
uns
unserer letzten Abfrage zu geben, zu sehen wir werden verwendet, um Operationen in Python (wie Addition oder Subtraktion) geschrieben wie A + B
(oder im Fall von or:), aber Python bietet auch Funktionen, um diese durchzuführen (d. h. or(a, b)
und and(a, b)
, die das gleiche tun würden).Diese sind in Situationen wie diesen nützlich, da sie als Parameter für andere Methoden verwendet werden können. Diese Funktionen wie "hinzufügen", "subtrahieren" usw. befinden sich im Modul operator
.
So mit dem operators
Modul, sehen wir, dass reduce(operator.and_, query_list)
jedes Q
Objekt in unserer Liste nimmt, und „-Verknüpfungs“ es mit den laufenden Ergebnissen der vorherigen Objekte in der Liste.
auf einer Seitennotiz, 'reduce' ist jetzt' functools.reduce' in Python 3 https://docs.python.org/3.0/library/functools.html#functools.reduce – wasabigeek