wake-up-neo.com

Filtern nach leeren oder NULL-Namen in einem Abfragesatz

Ich habe Vorname, Nachname und Alias ​​(optional), nach denen ich suchen muss. Ich benötige also eine Abfrage, um alle Namen zu erhalten, für die ein Alias ​​festgelegt wurde.

Nur wenn ich tun könnte:

Name.objects.filter(alias!="")

Also, was ist das Äquivalent zu dem oben genannten?

435
un33k

Sie könnten dies tun:

Name.objects.exclude(alias__isnull=True)

Wenn Sie Nullwerte und leere Zeichenfolgen ausschließen müssen, besteht die bevorzugte Möglichkeit darin, die Bedingungen wie folgt zu verketten:

Name.objects.exclude(alias__isnull=True).exclude(alias__exact='')

Wenn Sie diese Methoden miteinander verketten, wird jede Bedingung unabhängig voneinander überprüft. Im obigen Beispiel werden Zeilen ausgeschlossen, in denen alias entweder null oder eine leere Zeichenfolge ist. Sie erhalten also alle Name Objekte, die ein nicht-null, nicht-leeres alias Feld haben. Die 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 exclude übergeben, wodurch sichergestellt wird, dass nur Objekte ausgeschlossen werden, die jede Bedingung 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 bemerkt: 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 die von ihnen generierte SQL ansehen.

786
Sasha Chedygov
Name.objects.filter(alias__gt='',alias__isnull=False)
37
jbofill

Erstens wird in den Django -Dokumenten dringend empfohlen, keine NULL-Werte für zeichenfolgenbasierte Felder wie CharField oder TextField zu verwenden. Lesen Sie die Dokumentation für die Erklärung:

https://docs.djangoproject.com/en/dev/ref/models/fields/#null

Lösung: Sie können auch Methoden in QuerySets verketten, denke ich. Versuche dies:

Name.objects.exclude(alias__isnull=True).exclude(alias="")

Das sollte Ihnen das Set geben, das Sie suchen.

36
b3ng0

Von Django 1.8,

from Django.db.models.functions import Length

Name.objects.annotate(alias_length=Length('alias')).filter(alias_length__gt=0)
5

m häufige Fehler bei der Verwendung von exclude zu vermeiden, denken Sie daran:

Sie können nichtmehrere Bedingungen zu einem exclude () Block wie filter hinzufügen. Um mehrere Bedingungen auszuschließen, müssen Sie mehrere exclude () verwenden.

Beispiel

Falsch:

User.objects.filter (email='[email protected] '). Exclude (profile__nick_name =' ', profile__avt =' ')

Richtig:

User.objects.filter (email='[email protected] '). Exclude (profile__nick_name =' '). Exclude (profile__avt =' ')

2
HoangYell

Sie können dies einfach tun:

Name.objects.exclude(alias="").exclude(alias=None)

Es ist wirklich so einfach. filter wird verwendet, um eine Übereinstimmung zu erzielen, und exclude wird verwendet, um eine Übereinstimmung mit allem zu erzielen, außer dem, was es angibt. Dies würde in SQL als NOT alias='' AND alias IS NOT NULL ausgewertet.

0
Tim Tisdall

dies ist ein weiterer einfacher Weg, dies zu tun.

Name.objects.exclude(alias=None)
0
ImadOS