W modelu QuerySets Django widzę, że istnieją wartości porównawcze __gt
i __lt
dla nich, ale czy istnieje __ne
/ !=
/ <>
( nie równa się ?)
Chcę odfiltrować za pomocą nie równej:
Przykład:
Model:
bool a;
int x;
chcę
results = Model.objects.exclude(a=true, x!=5)
!=
Nie jest prawidłowa składnia. Próbowałem __ne
, <>
.
Skończyło się na tym, że:
results = Model.objects.exclude(a=true, x__lt=5).exclude(a=true, x__gt=5)
a=true
najpierw wyklucza wszystkie, a następnie stosujex=5
filtr do pozostałych. Zamierzone zapytanie wymagało tylko tych za=true
ix!=5
. Różnica polega na tym, że wszystkie te za=true
ix=5
są również odfiltrowane.Odpowiedzi:
Może obiekty Q mogłyby pomóc w rozwiązaniu tego problemu. Nigdy ich nie użyłem, ale wygląda na to, że można je zanegować i połączyć podobnie jak normalne wyrażenia w języku python.
Aktualizacja: Właśnie go wypróbowałem, wydaje się działać całkiem dobrze:
źródło
Twoje zapytanie wydaje się mieć podwójną wartość ujemną, chcesz wykluczyć wszystkie wiersze, w których x nie wynosi 5, więc innymi słowy, chcesz uwzględnić wszystkie wiersze, w których x IS 5. Wierzę, że to załatwi sprawę.
Aby odpowiedzieć na twoje konkretne pytanie, nie ma „nie równego”, ale prawdopodobnie dlatego, że django ma zarówno dostępne metody „filtrowania”, jak i „wykluczania”, więc zawsze możesz po prostu zmienić logikę, aby uzyskać pożądany wynik.
źródło
results = Model.objects.filter(a=true).exclude(x=5)
exclude
ifilter
połączenia nie miały znaczącej różnicy. Kolejność warunków wWHERE
klauzuli zmienia się, ale jak to ma znaczenie?field=value
składnia zapytań jest skrótemfield__exact=value
. To znaczy, że Django umieszcza operatory zapytania na polach zapytania w identyfikatorach . Django obsługuje następujące operatory:Jestem pewien, że łącząc je z obiektami Q, jak sugeruje Dave Vogt, i używając
filter()
lubexclude()
jak sugeruje Jason Baker, dostaniesz dokładnie to, czego potrzebujesz na każde możliwe zapytanie.źródło
tg=Tag.objects.filter(user=request.user).exclude(name__regex=r'^(public|url)$')
i to działa.icontains
,iexact
i podobne oznaczają „ignoruj rozróżnianie wielkości liter”. Nie dotyczy „odwrotności”.exclude()
wielu terminów, możesz chcieć skomponować propozycję zOR
operatorem, np.exclude(Q(field1__queryop1=value1) | Q(field2__queryop2=value2))
W celu wykluczenia wyników w obu warunkach.Łatwo jest utworzyć niestandardowe wyszukiwanie za pomocą Django 1.7.
__ne
Przykładowy odnośnik znajduje się w oficjalnej dokumentacji Django .Najpierw musisz utworzyć sam odnośnik:
Następnie musisz go zarejestrować:
A teraz możesz użyć
__ne
odnośnika w swoich zapytaniach w następujący sposób:źródło
W Django 1.9 / 1.10 istnieją trzy opcje.
Łańcuch
exclude
ifilter
Używaj
Q()
obiektów i~
operatoraZarejestruj niestandardową funkcję wyszukiwania
register_lookup
Dekorator dodano Django 1,8 i pozwala na zamówienie odnośnika, jak zwykle:źródło
Choć z modelami można filtrować z
=
,__gt
,__gte
,__lt
,__lte
, nie można używaćne
,!=
lub<>
. Można jednak uzyskać lepsze filtrowanie przy użyciu obiektu Q.Można uniknąć łączenia
QuerySet.filter()
iQuerySet.exlude()
, i użyj tego:źródło
Do czasu decyzji projektowej. Tymczasem użyj
exclude()
Moduł śledzenia problemów Django ma niezwykły wpis # 5763 , zatytułowany „Zestaw zapytań nie ma operatora filtru„ nie równy ”” . Jest to niezwykłe, ponieważ (od kwietnia 2016 r.) Został „otwarty 9 lat temu” (w epoce kamienia Django), „zamknięty 4 lata temu” i „ostatnio zmieniony 5 miesięcy temu”.
Przeczytaj dyskusję, to jest interesujące. Zasadniczo niektórzy twierdzą, że
__ne
należy dodać, podczas gdy inni twierdzą, żeexclude()
jest jaśniejszy, a zatem nie__ne
powinien go dodawać.(Zgadzam się z pierwszym, ponieważ drugi argument jest mniej więcej równoważny z twierdzeniem, że Python nie powinien mieć,
!=
ponieważ ma==
inot
już ...)źródło
Używanie wykluczania i filtrowania
źródło
Powinieneś użyć
filter
iexclude
takźródło
Ostatni bit kodu wyklucza wszystkie obiekty, w których x! = 5, a a ma wartość True. Spróbuj tego:
Pamiętaj, że znak = w powyższej linii przypisuje wartość Fałsz do parametru a, a liczbę 5 do parametru x. Nie sprawdza równości. Dlatego tak naprawdę nie ma żadnego sposobu użycia symbolu! = W wywołaniu zapytania.
źródło
results = Model.objects.filter(a__in=[False,None],x=5)
źródło
Django-model-values (ujawnienie: autor) zapewnia implementację wyszukiwania NotEqual , jak w tej odpowiedzi . Zapewnia również obsługę składniową:
źródło
Co szukasz są wszystkie obiekty, które mają albo
a=false
albox=5
. W Django|
służy jakoOR
operator między zestawami zapytań:źródło
To da pożądany rezultat.
dla nierównego możesz użyć
~
dla równego zapytania. oczywiścieQ
można go użyć do osiągnięcia równego zapytania.źródło
Q(a=True) and ~Q(x=5)
spowoduje, że będą~Q(x=5)
argumentami.exclude
. Proszę przeczytać: docs.python.org/3/reference/expressions.html#boolean-operations i docs.python.org/3/reference/… .Uważaj na wiele niepoprawnych odpowiedzi na to pytanie!
Logika Gerarda jest poprawna, ale zwraca listę zamiast zestawu zapytań (co może nie mieć znaczenia).
Jeśli potrzebujesz zestawu zapytań, użyj Q:
źródło