Odpowiedzi:
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
do połączenia warunków. Zmodyfikuję swoją odpowiedź, aby wyjaśnić.
NOT (A AND B)
jest równoważne NOT 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 w OR
ponieważ używasz exclude
. W ogólnym przypadku prawdopodobnie bardziej poprawne jest myślenie o łańcuchach jako THEN
, tj exclude(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
i OR
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ę.
Name.objects.filter(alias__gt='',alias__isnull=False)
alias__isnull=False
warunek jest zbędny. Jeśli pole jest z Null
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:
Name.objects.exclude(alias__isnull=True).exclude(alias="")
To powinno dać ci zestaw, którego szukasz.
Od Django 1.8,
from django.db.models.functions import Length
Name.objects.annotate(alias_length=Length('alias')).filter(alias_length__gt=0)
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
Błędny :
User.objects.filter (email='example@example.com '). Exclude (profile__nick_name =' ', profile__avt =' ')
Poprawny :
User.objects.filter (email='example@example.com '). Exclude (profile__nick_name =' '). Exclude (profile__avt =' ')
Możesz po prostu to zrobić:
Name.objects.exclude(alias="").exclude(alias=None)
To naprawdę takie proste. filter
służy do dopasowania i exclude
ma na celu dopasowanie wszystkiego oprócz tego, co określa. Oznaczałoby to wyrażenie SQL jako NOT alias='' AND alias IS NOT NULL
.
alias=""
) i NULL ( alias=None
). Twoje obejmowałyby wystąpienia z Name(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.
Name.objects.exclude(alias=None)
None
to nie to samo co ""
.
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 .