Ich möchte eine Django-Abfrage schreiben, die dieser SQL-Abfrage entspricht:
SELECT * from user where income >= 5000 or income is NULL.
Wie konstruiere ich den Django-Queryset-Filter?
User.objects.filter(income__gte=5000, income=0)
Dies funktioniert nicht, weil es AND
die Filter sind. Ich möchte, dass OR
die Filter die Vereinigung einzelner Abfragesätze erhalten.
Antworten:
über Dokumentation
quelle
Da QuerySets den Python-
__or__
Operator (|
) oder die Union implementieren , funktioniert dies einfach. Wie zu erwarten, gibt der|
Binäroperator einQuerySet
so zurückorder_by()
,.distinct()
und andere Abfragesatzfilter können bis zum Ende angeheftet werden.Update 2019-06-20: Dies ist jetzt vollständig in der QuerySet-API-Referenz für Django 2.1 dokumentiert . Weitere historische Diskussionen finden Sie im DjangoProject-Ticket Nr. 21333 .
quelle
Beide Optionen sind bereits in den vorhandenen Antworten erwähnt:
und
Es scheint jedoch einige Verwirrung darüber zu geben, welche man bevorzugen soll.
Der Punkt ist, dass sie auf SQL-Ebene identisch sind. Wählen Sie also aus, was Sie möchten!
Das Django ORM-Kochbuch spricht ausführlich darüber, hier ist der relevante Teil:
führt zu
und
führt zu
Quelle: Django-Orm-Kochbuch
quelle