Sie können dies tun:
Name.objects.exclude(alias__isnull=True)
Wenn Sie die bevorzugte Art und Weise null Werte und leere Strings ausschließen müssen, so zu tun, um Kette zusammen die Bedingungen wie folgt:
Name.objects.exclude(alias__isnull=True).exclude(alias__exact='')
Verkettung dieser Methoden zusammen überprüft im Grunde jede Bedingung unabhängig: im obigen Beispiel schließen wir Zeilen aus, bei denen alias
null oder eine leere Zeichenfolge ist, so dass Sie Erhalten Sie alle Name
Objekte, die ein Nicht-Null-, Nicht-Leer-alias
-Feld haben. Die erzeugte SQL würde in etwa so aussehen:
SELECT * FROM Name WHERE alias IS NOT NULL AND alias != ""
Sie auch mehrere Argumente an einen einzigen Aufruf exclude
passieren kann, die, dass nur Objekte sicherstellen würde, dass erfüllen jeden Zustand ausgeschlossen erhalten:
Name.objects.exclude(some_field=True, other_field=True)
Hier werden Zeilen, in denen some_field
undother_field
wahr sind, ausgeschlossen, sodass wir alle Zeilen erhalten, in denen beide Felder nicht wahr sind. Der generierte SQL-Code wäre ein wenig wie folgt aussehen:
SELECT * FROM Name WHERE NOT (some_field = TRUE AND other_field = TRUE)
Alternativ kann, wenn die Logik komplexer als das ist, könnten Sie Djangos Q objects:
from django.db.models import Q
Name.objects.exclude(Q(alias__isnull=True) | Q(alias__exact=''))
Für weitere Informationen siehe this page und this page in die Django-Dokumente.
Nebenbei: Meine SQL-Beispiele sind nur eine Analogie - der tatsächlich generierte SQL-Code wird wahrscheinlich anders aussehen. Sie erhalten ein tieferes Verständnis darüber, wie Django-Abfragen funktionieren, indem Sie sich das von ihnen generierte SQL ansehen.
Ich glaube, dass Ihre Bearbeitung falsch ist: Chaining Filter erstellt nicht automatisch eine SQL 'OR' (nur in diesem Fall), erzeugt es eine SQL' AND'. Sehen Sie diese Seite als Referenz: https://docs.djangoproject.com/en/dev/topics/db/queries/#chaining-filters Der Vorteil der Verkettung ist, dass Sie 'exclude' und' filter' zum Modellieren mischen können komplizierte Abfragebedingungen Wenn Sie ein echtes SQL 'OR' modellieren möchten, müssen Sie ein Django Q-Objekt verwenden: https://docs.djangoproject.com/en/dev/topics/db/queries/#complex-lookups-with-q- Objekte Bitte bearbeiten Sie Ihre Bearbeitung, um dies zu reflektieren, da die Antwort stark irreführend ist, wie es aussieht. – shezi
@shezi: Ich meinte es mehr als eine Analogie - ich wollte nicht, dass der eigentliche SQL-Code ist ein OR zu verwenden, um die Bedingungen zu fusionieren. Ich werde meine Antwort bearbeiten, um sie zu klären. –
Denken Sie daran, dass es verschiedene Möglichkeiten gibt, diese Logik zu repräsentieren - zum Beispiel ist "NOT (A AND B)" äquivalent zu "NOT A OR NOT B". Ich denke, das macht die neuen Django-Entwickler, die SQL beherrschen, aber mit ORMs nicht vertraut sind, etwas verwirrend. –