Ich möchte in der Lage sein, die Elemente aufzulisten, die entweder ein Benutzer hinzugefügt hat (sie werden als Ersteller aufgeführt) oder das Element wurde genehmigt.
Also muss ich grundsätzlich auswählen:
item.creator = owner or item.moderated = False
Wie würde ich das in Django machen? (vorzugsweise mit einem Filter oder einem Abfragesatz).
for f in filters: Item.objects.filter(Q(creator=f1) | Q(creator=f2) | ...)
reduce(lambda q, f: q | Q(creator=f), filters, Q())
das große Q-Objekt.Item.objects.filter(creator__in=creators)
zum Beispiel auch tun .|
die Verwendung als ODER-Operator stammt, ist dies tatsächlich der Set-Union-Operator. Es wird auch (nicht hier) als bitweises ODER verwendet: stackoverflow.com/questions/5988665/pipe-character-in-pythonSie können die | verwenden Operator zum direkten Kombinieren von Abfragesätzen, ohne dass Q-Objekte benötigt werden:
(Bearbeiten - Ich war anfangs nicht sicher, ob dies eine zusätzliche Abfrage verursachte, aber @spookylukey wies darauf hin, dass die verzögerte Abfrage des Abfragesatzes dies erledigt.)
quelle
Es ist zu beachten, dass es möglich ist, Q- Ausdrücke hinzuzufügen .
Zum Beispiel:
Dies endet mit einer Abfrage wie:
Auf diese Weise gibt es keine Notwendigkeit , zu behandeln oder Betreiber, reduziert die usw.
quelle
query |= Q(email='[email protected]')
?Wenn Sie den Filter dynamisch machen möchten, müssen Sie Lambda wie verwenden
reduce(lambda x, y: x | y, [Q(brand=item) for item in brands])
ist äquivalent zuquelle
from functools import reduce
vorher tun .operator.or_
statt verwendenlambda x, y: x | y
?Ähnlich wie bei älteren Answera, aber etwas einfacher, ohne das Lambda:
So filtern Sie diese beiden Bedingungen mit
OR
:So erzielen Sie programmgesteuert das gleiche Ergebnis:
(aus Gründen der Klarheit in zwei Zeilen unterteilt)
operator
befindet sich in der Standardbibliothek:import operator
Von docstring:
Für Python3
reduce
ist es nicht mehr integriert, befindet sich aber immer noch in der Standardbibliothek:from functools import reduce
PS
Vergessen Sie nicht, sicherzustellen, dass
list_of_Q
es nicht leer ist -reduce()
wird bei leerer Liste ersticken, es benötigt mindestens ein Element.quelle
Dies kann nützlich sein https://docs.djangoproject.com/de/dev/topics/db/queries/#spanning-multi-valued-relationships
Grundsätzlich klingt es so, als ob sie als ODER fungieren
quelle