Antworten:
Sie könnten dies tun:
Name.objects.exclude(alias__isnull=True)
Wenn Sie Nullwerte und leere Zeichenfolgen ausschließen müssen, können Sie die Bedingungen wie folgt miteinander verketten:
Name.objects.exclude(alias__isnull=True).exclude(alias__exact='')
Wenn Sie diese Methoden miteinander verketten, wird grundsätzlich jede Bedingung unabhängig überprüft: Im obigen Beispiel schließen wir Zeilen aus, in denen alias
entweder null oder eine leere Zeichenfolge ist, sodass Sie alle Name
Objekte erhalten, die ein nicht null, nicht leeres alias
Feld haben. Das generierte SQL würde ungefähr so aussehen:
SELECT * FROM Name WHERE alias IS NOT NULL AND alias != ""
Sie können auch mehrere Argumente an einen einzelnen Aufruf von übergeben exclude
, um sicherzustellen, dass nur Objekte ausgeschlossen werden, die alle Bedingungen erfüllen :
Name.objects.exclude(some_field=True, other_field=True)
Hier werden Zeilen, in denen some_field
und other_field
wahr sind, ausgeschlossen, sodass wir alle Zeilen erhalten, in denen beide Felder nicht wahr sind. Der generierte SQL-Code würde ungefähr so aussehen:
SELECT * FROM Name WHERE NOT (some_field = TRUE AND other_field = TRUE)
Wenn Ihre Logik komplexer ist, können Sie alternativ Djangos Q-Objekte verwenden :
from django.db.models import Q
Name.objects.exclude(Q(alias__isnull=True) | Q(alias__exact=''))
Weitere Informationen finden Sie auf dieser Seite und auf dieser Seite in den Django-Dokumenten.
Nebenbei: Meine SQL-Beispiele sind nur eine Analogie - der tatsächlich generierte SQL-Code wird wahrscheinlich anders aussehen. Sie erhalten ein tieferes Verständnis der Funktionsweise von Django-Abfragen, indem Sie sich das von ihnen generierte SQL ansehen.
OR
, um die Bedingungen zu verschmelzen. Ich werde meine Antwort bearbeiten, um dies zu klären.
NOT (A AND B)
gleichbedeutend mit NOT A OR NOT B
. Ich denke, das macht die Dinge für neue Django-Entwickler verwirrend, die SQL kennen, aber mit ORMs nicht vertraut sind.
AND
in der ersten Abfrage in ein zu verwandeln, OR
weil Sie es verwenden exclude
. Im allgemeinen Fall ist es wahrscheinlich richtiger, sich Verkettung als a vorzustellen THEN
, dh exclude(A) THEN exclude(B)
. Entschuldigung für die raue Sprache oben. Ihre Antwort ist wirklich gut, aber ich mache mir Sorgen, dass neue Entwickler Ihre Antwort zu allgemein nehmen.
AND
und OR
könnte für jemanden nützlich sein Kommen zu Django aus einem SQL - Hintergrund. Für ein tieferes Verständnis von Django denke ich, dass die Dokumente einen besseren Job machen als ich kann.
Name.objects.filter(alias__gt='',alias__isnull=False)
alias__isnull=False
Bedingung ist überflüssig. Wenn das Feld Null
sicher ist, wird es durch die erste Klausel ausgeschlossen?
alias__gt
war das einzige, was für JSON-Spalten funktionierte, bei denen ich leere Zeichenfolgen wie JSON ausschließen wollte {'something:''}
. Die funktionierende Syntax lautet also:jsoncolumnname__something__gt=''
Erstens wird in den Django-Dokumenten dringend empfohlen, keine NULL-Werte für stringbasierte Felder wie CharField oder TextField zu verwenden. Lesen Sie die Dokumentation zur Erklärung:
https://docs.djangoproject.com/de/dev/ref/models/fields/#null
Lösung: Ich denke, Sie können Methoden in QuerySets auch miteinander verketten. Versuche dies:
Name.objects.exclude(alias__isnull=True).exclude(alias="")
Das sollte dir das Set geben, das du suchst.
Von Django 1.8,
from django.db.models.functions import Length
Name.objects.annotate(alias_length=Length('alias')).filter(alias_length__gt=0)
Denken Sie daran, um häufige Fehler bei der Verwendung zu vermeiden exclude
:
Sie können einem exclude () -Block wie nicht mehrere Bedingungen hinzufügen . Um mehrere Bedingungen auszuschließen, müssen Sie mehrere exclude () verwenden.filter
Beispiel
Falsch :
User.objects.filter (email='example@example.com '). Exclude (profile__nick_name =' ', profile__avt =' ')
Richtig :
User.objects.filter (email='example@example.com '). Exclude (profile__nick_name =' '). Exclude (profile__avt =' ')
Sie können dies einfach tun:
Name.objects.exclude(alias="").exclude(alias=None)
Es ist wirklich so einfach. filter
wird verwendet, um übereinzustimmen und exclude
um alles zusammenzubringen, außer was es spezifiziert. Dies würde in SQL als ausgewertet NOT alias='' AND alias IS NOT NULL
.
alias=""
) und NULL ( alias=None
) Aliase von der Abfrage auszuschließen . Ihre würde Instanzen mit einschließen Name(alias=None)
.
.filter(alias!="")
dem Titel entspricht, aber nicht. Ich habe meine Antwort bearbeitet. Zeichenfelder sollten jedoch keine NULL-Werte zulassen und die leere Zeichenfolge für einen Nichtwert verwenden (gemäß Konvention).
Dies ist ein weiterer einfacher Weg, dies zu tun.
Name.objects.exclude(alias=None)
None
ist nicht dasselbe wie ""
.
OR
(nur in diesem Fall), sondern eine SQLAND
. Weitere Informationen finden Sie auf dieser Seite: docs.djangoproject.com/de/dev/topics/db/queries/… Der Vorteil der Verkettung besteht darin, dass Sie komplizierte Abfragebedingungen mischenexclude
undfilter
modellieren können. Wenn Sie eine echte SQL modellieren möchten,OR
müssen Sie ein Django Q-Objekt verwenden: docs.djangoproject.com/de/dev/topics/db/queries/… Bitte bearbeiten Sie Ihre Bearbeitung, um dies widerzuspiegeln, da die Antwort derzeit stark irreführend ist .