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?
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 alias
jest 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.
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.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)
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)
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.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