644 Stimmen

Wie filtert man leere oder NULL-Namen in einem QuerySet?

Ich habe first_name , last_name & alias (fakultativ), nach denen ich suchen muss. Ich brauche also eine Abfrage, die mir alle Namen liefert, die einen Alias haben.

Nur wenn ich es könnte:

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

Was ist also das Äquivalent zu den oben genannten Punkten?

1140voto

Sasha Chedygov Punkte 121566

Sie könnten dies tun:

Name.objects.exclude(alias__isnull=True)

Wenn Sie Nullwerte ausschließen müssen und leere Zeichenketten, ist die bevorzugte Methode, dies zu tun, die Bedingungen wie folgt zu verketten:

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

Die Verkettung dieser Methoden prüft im Grunde jede Bedingung unabhängig: Im obigen Beispiel schließen wir Zeilen aus, in denen alias ist entweder null ou eine leere Zeichenkette, so dass Sie alle Name Objekte, die ein nicht-null, nicht-leer alias Bereich. Das generierte SQL würde etwa so aussehen:

SELECT * FROM Name WHERE alias IS NOT NULL AND alias != ""

Sie können auch mehrere Argumente an einen einzigen Aufruf von exclude die sicherstellen würde, dass nur Objekte, die die jede Bedingung ausgeschlossen werden:

Name.objects.exclude(some_field=True, other_field=True)

Hier werden Zeilen, in denen some_field und other_field wahr sind, werden ausgeschlossen, so dass wir alle Zeilen erhalten, in denen beide Felder nicht wahr sind. Der generierte SQL-Code würde in etwa so aussehen:

SELECT * FROM Name WHERE NOT (some_field = TRUE AND other_field = TRUE)

Wenn Ihre Logik komplexer ist, können Sie alternativ auch Djangos Q Objekte :

from django.db.models import Q
Name.objects.exclude(Q(alias__isnull=True) | Q(alias__exact=''))

Für weitere Informationen siehe diese Seite y diese 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 werden ein tieferes Verständnis dafür bekommen, wie Django-Abfragen funktionieren, wenn Sie sich den generierten SQL-Code ansehen.

80voto

jbofill Punkte 776
Name.objects.filter(alias__gt='',alias__isnull=False)

42voto

b3ng0 Punkte 595

Erstens empfehlen die Django-Dokumente dringend, keine NULL-Werte für String-basierte 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 auf QuerySets verketten, denke ich. Versuchen Sie dies:

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

Damit sollten Sie das gewünschte Set erhalten.

14voto

Wenn Sie null ausschließen wollen ( None ), leere Zeichenkette ( "" ), sowie eine Zeichenkette, die Leerzeichen enthält ( " " ), können Sie die __regex zusammen mit __isnull Filteroption

Name.objects.filter(
    alias__isnull = False, 
    alias__regex = r"\S+"
)

alias__isnull=False schließt alle Spalten aus null Spalten

aliax__regex = r"\S+" stellt sicher, dass der Spaltenwert mindestens ein oder mehrere Zeichen ohne Leerzeichen enthält.

8voto

HoangYell Punkte 2873

1. Beachten Sie bei der Verwendung von exclude die folgenden Punkte, um häufige Fehler zu vermeiden:

Sollte no hinzufügen. mehrere Bedingungen in eine exclude() Block wie filter() . Um mehrere Bedingungen auszuschließen, sollten Sie mehrere exclude() .

Ejemplo: (NOT a AND NOT b)

Entry.objects.exclude(title='').exclude(headline='')

gleich

SELECT... WHERE NOT title = '' AND NOT headline = ''

\======================================================

2. Verwenden Sie mehrere nur, wenn Sie es wirklich wissen:

Ejemplo: NOT (a AND b)

Entry.objects.exclude(title='', headline='')

gleich

SELECT.. WHERE NOT (title = '' AND headline = '')

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X