Wie mache ich eine ODER filter in einer Django-Abfrage?
Ich möchte in der Lage sein, um eine Liste der Elemente, die ein Benutzer Hinzugefügt hat (Sie aufgeführt sind, als den Schöpfer) oder der Artikel wurde genehmigt.
Also habe ich im Grunde muss wählen:
item.creator = owner or item.moderated = False
Wie würde ich das in Django? (vorzugsweise mit einem filter oder queryset).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist
Q
Objekte, die es ermöglichen, komplexe Suchvorgänge. Beispiel:for f in filters: Item.objects.filter(Q(creator=f1) | Q(creator=f2) | ...)
reduce(lambda q, f: q | Q(creator=f), filters, Q())
zu erstellen, die große F-Objekt.Item.objects.filter(creator__in=creators)
zum Beispiel.|
verwendet wird als ODER-operator kommt, es ist eigentlich die set-operator union. Es ist auch (nicht hier) als bitweise ODER-Verknüpfung: stackoverflow.com/questions/5988665/pipe-character-in-pythonKönnen Sie mithilfe der | - operator zu kombinieren querysets direkt ohne Q-Objekte:
(edit - ich war zunächst nicht sicher, ob dies verursacht eine zusätzliche Abfrage, aber @spookylukey wies darauf hin, dass faul queryset Bewertung übernimmt)
Sie wollen, um dynamische filter, dann verwenden Sie die Lambda wie
reduce(lambda x, y: x | y, [Q(brand=item) for item in brands])
entsprichtfrom functools import reduce
vorher.Lohnt es sich, zu beachten, dass es möglich ist, fügen Sie Q Ausdrücken.
Beispiel:
Endet dies mit einer Abfrage wie :
Diese Weise gibt es keine Notwendigkeit, sich mit oder Betreiber, reduzieren usw.
Ähnlich älteren answera, aber ein bisschen einfacher, ohne die lambda:
Filtern diese zwei Bedingungen mit
OR
:Das gleiche Ergebnis zu erhalten programmatisch:
(gebrochen in zwei Linien, die hier für Klarheit)
operator
ist in der standard Bibliothek:import operator
Von docstring:
Für Python ist3,
reduce
ist nicht vordefiniert, mehr aber noch in die standard-Bibliothek:from functools import reduce
P. S.
Vergessen Sie nicht, stellen Sie sicher, dass
list_of_Q
ist nicht leer -reduce()
ersticken wird auf die leere Liste, muss es mindestens ein element.Könnte dies nützlich sein https://docs.djangoproject.com/en/dev/topics/db/queries/#spanning-multi-valued-relationships
Im Grunde klingt es wie Sie so handeln, wie ODER