Mam first_name
, last_name
i alias
(opcjonalnie), które muszę szukać. Potrzebuję więc zapytania, aby podać wszystkie nazwy, które mają ustawiony alias.
Tylko gdybym mógł:
Name.objects.filter(alias!="")
Więc co jest równoważne z powyższym?
Mam first_name
, last_name
i alias
(opcjonalnie), które muszę szukać. Potrzebuję więc zapytania, aby podać wszystkie nazwy, które mają ustawiony alias.
Tylko gdybym mógł:
Name.objects.filter(alias!="")
Więc co jest równoważne z powyższym?
Możesz to zrobić:
Name.objects.exclude(alias__isnull=True)
Jeśli chcesz wykluczyć wartości puste i puste ciągi, preferowanym sposobem jest połączenie ze sobą następujących warunków:
Name.objects.exclude(alias__isnull=True).exclude(alias__exact='')
Łączenie tych metod razem zasadniczo sprawdza każdy warunek niezależnie: w powyższym przykładzie wykluczamy wiersze, w których alias
jest albo zerowy, albo pusty ciąg znaków, więc otrzymujesz wszystkie Name
obiekty, które mają niepuste, niepuste alias
pole. Wygenerowany SQL wyglądałby mniej więcej tak:
SELECT * FROM Name WHERE alias IS NOT NULL AND alias != ""
Możesz również przekazać wiele argumentów do pojedynczego wywołania exclude
, co zapewni, że wykluczone zostaną tylko obiekty spełniające każdy warunek:
Name.objects.exclude(some_field=True, other_field=True)
Tutaj wiersze, w których some_field
i other_field
są prawdziwe, są wykluczane, 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ć obiektów Q Django :
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.
Nawiasem mówiąc: moje przykłady SQL są tylko analogią - faktyczny wygenerowany kod SQL prawdopodobnie będzie wyglądał inaczej. Zgłębisz zrozumienie działania zapytań Django, patrząc na generowany przez nich SQL.
OR
(tylko w tym przypadku), tworzy SQLAND
. Zobacz tę stronę w celach informacyjnych: docs.djangoproject.com/en/dev/topics/db/queries/… Zaletą tworzenia łańcuchów jest mieszanieexclude
ifilter
modelowanie skomplikowanych warunków zapytań. Jeśli chcesz wymodelować prawdziwy SQLOR
, musisz użyć obiektu Django Q: docs.djangoproject.com/en/dev/topics/db/queries/... Edytuj swoją edycję, aby to odzwierciedlić, ponieważ odpowiedź jest bardzo myląca .OR
do połączenia warunków. Zmodyfikuję swoją odpowiedź, aby wyjaśnić.NOT (A AND B)
jest równoważneNOT A OR NOT B
. Myślę, że to wprowadza zamieszanie u nowych programistów Django, którzy znają SQL, ale nie znają ORM.AND
pierwszego zapytania wOR
ponieważ używaszexclude
. W ogólnym przypadku prawdopodobnie bardziej poprawne jest myślenie o łańcuchach jakoTHEN
, tjexclude(A) THEN exclude(B)
. Przepraszamy za ostry język powyżej. Twoja odpowiedź jest naprawdę dobra, ale martwię się, że nowi programiści przyjmą ją zbyt ogólnie.AND
iOR
może być przydatne dla kogoś, kto przyjeżdża do Django z tła SQL. Aby lepiej zrozumieć Django, myślę, że doktorzy wykonują lepszą robotę niż potrafię.źródło
alias__isnull=False
warunek jest zbędny. Jeśli pole jest zNull
pewnością, zostanie wykluczone przez pierwszą klauzulę?alias__gt
była jedyną rzeczą, która działała w kolumnach typu JSON, w których chciałem wykluczyć puste ciągi znaków z JSON jak{'something:''}
. Więc działająca składnia to:jsoncolumnname__something__gt=''
Po pierwsze, dokumenty Django zdecydowanie nie zalecają używania wartości NULL dla pól opartych na ciągach znaków, takich jak CharField lub TextField. Przeczytaj dokumentację wyjaśniającą:
https://docs.djangoproject.com/en/dev/ref/models/fields/#null
Rozwiązanie: Myślę, że możesz również łączyć ze sobą metody w QuerySets. Spróbuj tego:
To powinno dać ci zestaw, którego szukasz.
źródło
Od Django 1.8,
źródło
Aby uniknąć typowych błędów podczas używania
exclude
, pamiętaj:Można nie dodać wiele warunków do wykluczenia () bloku podobnego
filter
. Aby wykluczyć wiele warunków, musisz użyć wielu wykluczeń ()Przykład
źródło
Możesz po prostu to zrobić:
To naprawdę takie proste.
filter
służy do dopasowania iexclude
ma na celu dopasowanie wszystkiego oprócz tego, co określa. Oznaczałoby to wyrażenie SQL jakoNOT alias='' AND alias IS NOT NULL
.źródło
alias=""
) i NULL (alias=None
). Twoje obejmowałyby wystąpienia zName(alias=None)
..filter(alias!="")
tytułowi, ale nie było. Zredagowałem swoją odpowiedź. Jednak pola znakowe nie powinny zezwalać na wartości NULL i używać pustego ciągu jako wartości innej niż (zgodnie z konwencją).to kolejny prosty sposób na zrobienie tego.
źródło
None
to nie to samo co""
.