Jak zrobić filtrowanie mniejsze lub równe w zestawie zapytań Django?

175

Próbuję filtrować użytkowników według niestandardowego pola w każdym profilu użytkownika o nazwie profil. To pole nazywa się poziomem i jest liczbą całkowitą z przedziału od 0 do 3.

Jeśli filtruję za pomocą równości, otrzymuję listę użytkowników z wybranym poziomem zgodnie z oczekiwaniami:

user_list = User.objects.filter(userprofile__level = 0)

Kiedy próbuję filtrować, używając mniej niż:

user_list = User.objects.filter(userprofile__level < 3)

Wyskakuje mi błąd:

nazwa globalna „userprofile__level” nie jest zdefiniowana

Czy istnieje sposób na filtrowanie według <lub>, czy też szczekam na niewłaściwe drzewo.

Finglish
źródło
2
@ BéresBotond Chociaż dokumenty wyglądają świetnie - struktura i układ są tak słabe, że bez bezpośredniego linku wszystkie są bezużyteczne
RunLoop
@ BéresBotond Niestety ten link jest teraz martwy :(
dKen
Link roboczy do dokumentu: docs.djangoproject.com/en/1.11/ref/models/querysets/#gt
Gaurav Pandey

Odpowiedzi:

337

Mniejsze lub równe:

User.objects.filter(userprofile__level__lte=0)

Większe lub równe:

User.objects.filter(userprofile__level__gte=0)

Podobnie ltza mniej niż i gtza więcej niż. Znajdziesz je wszystkie w dokumentacji .

Lakshman Prasad
źródło
2
Wow, to było szybkie :). Działa to świetnie w przypadku mniej niż lub równych, ale co powiesz na mniej niż? (userprofile__level__lt = 3) nie działa
Finglish
1
To robi; ale w każdym przypadku możesz także zrobić wykluczenie (__ gte) zamiast filtru (__ lt).
Lakshman Prasad
2
I NIE zapominaj, że są dwa __podkreślenia
andilabs
Otrzymuję ten błąd -> {FieldError} Nieobsługiwany poziom wyszukiwania AutoField lub dołączanie do pola jest niedozwolone.
Aravind R Pillai,