2013-04-18 7 views
13

ich diesewas diesen Operator tut bedeutet in django `reduzieren (operator.and_, query_list)`

Constructing Django filter queries dynamically with args and kwargs

Ich bin nicht in der Lage in Frage lese zu bekommen, was diesen Operator macht

filter(reduce(operator.or_, argument_list))

oder diese

filter(reduce(operator.and_, query_list))

+0

auf einer Seitennotiz, 'reduce' ist jetzt' functools.reduce' in Python 3 https://docs.python.org/3.0/library/functools.html#functools.reduce – wasabigeek

Antwort

14

filter ist eine reguläre Methode von Django Model Manager, es gibt also nichts zu erklären.

reduce ist eine integrierte Funktion ähnlich dem folgenden Code:

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

    return result 

Wo func ist eine benutzerdefinierte Funktion.

operator.or_ ist eine Python-Standardbibliotheksfunktion, die den Operator or umschließt. Es ist ähnlich wie dieser Code:

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

Zum Beispiel:

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

Werden True zurück.

In Ihrem Beispiel Zusammenhang die or und die and Betreiber überlastet sind und daher sollte es eine neue Abfrage zurückgeben alle von or oder and Operator kombiniert kleineren Teilen zusammengesetzt ist.

+0

Ich Hauptsache möchte ich wissen ist 'operator.and_' was macht das – user194932147

+0

Siehe die aktualisierte Post. – Yossi

+0

Vielen Dank! Sie haben in ein paar Zeilen erklärt, was ein paar Beispiele nicht können. Das Ergebnis = items.pop() erklärt, warum ich den Fehler über Typen bekommen habe, wenn ich über eine Objektliste iteriere und versuche, eine Eigenschaft dieses Objekts zu reduzieren. –

4

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 ORQ(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.

+0

gibt es eine Möglichkeit, die Zeichenfolgendarstellung von Q Objects in Abfrage _list zu sehen, um zu sehen, whta Abfrage es bauen. wenn ich 'query_list' in shell_plus tippe, gibt es mir das Q-Objekt mit einer ID. Ich möchte wissen, welche Abfrage sein Gebäude – user194932147