Filtrowanie pustych lub NULL nazw w zestawie zapytań

Mam first_name, last_name & alias (opcjonalne), które muszę wyszukać. Więc potrzebuję zapytania, aby podać mi wszystkie nazwy, które mają ustawiony alias.

Only if I could do:

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

Więc, jaki jest odpowiednik powyższego?

Author: un33k, 2009-05-10

5 answers

Możesz to zrobić:

Name.objects.exclude(alias__isnull=True)

Jeśli musisz wykluczyć wartości null i puste łańcuchy, preferowanym sposobem na to jest połączenie ze sobą takich warunków jak:

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

Łączenie tych metod w łańcuchy zasadniczo sprawdza każdy warunek niezależnie: w powyższym przykładzie wykluczamy wiersze, w których aliasjest albo null albo pusty łańcuch, więc otrzymujemy wszystkie Name obiekty, które mają pole not-null, not-empty alias. Wygenerowany SQL wyglądałby jak coś like:

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

Można również przekazać wiele argumentów do pojedynczego wywołania exclude, co zapewni, że tylko obiekty spełniające każdy warunek zostaną wykluczone:

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

Tutaj wiersze, w których some_field oraz other_field are true get excluded, więc otrzymujemy wszystkie wiersze, w których oba pola nie są prawdziwe. Wygenerowany kod SQL wyglądałby trochę tak:

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

Alternatywnie, jeśli twoja logika jest bardziej złożona, możesz użyć Q Django obiekty :

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

Aby uzyskać więcej informacji zobacz tę stronę i tę stronę W dokumentach Django.

na marginesie: moje przykłady SQL są tylko analogią-rzeczywisty wygenerowany kod SQL będzie prawdopodobnie wyglądał inaczej. Uzyskasz głębsze zrozumienie, jak działają zapytania Django, patrząc na generowany przez nie SQL.

 686
Author: Sasha Chedygov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-17 21:14:12

Po pierwsze, dokumenty Django zdecydowanie zalecają, aby nie używać wartości NULL dla pól opartych na łańcuchach, takich jak CharField czy TextField. Przeczytaj dokumentację dla wyjaśnienia:

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

Rozwiązanie: Możesz również łączyć metody na zestawach zapytań, tak myślę. Spróbuj tego:

Name.objects.exclude(alias__isnull=True).exclude(alias="")
To powinno dać ci zestaw, którego szukasz.
 34
Author: b3ng0,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-24 15:31:18
Name.objects.filter(alias__gt='',alias__isnull=False)
 32
Author: jbofill,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-23 09:14:06

From Django 1.8,

from django.db.models.functions import Length

Name.objects.annotate(alias_length=Length('alias')).filter(alias_length__gt=0)
 3
Author: Chemical Programmer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-06 12:02:21

Możesz po prostu to zrobić:

Name.objects.exclude(alias="")
Odpowiedzi wydają się być tańczące, ale to naprawdę takie proste. filter jest używany do dopasowania i {[2] } jest do dopasowania wszystkiego oprócz tego, co określa.
 0
Author: Tim Tisdall,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-08 15:29:35