Comment faire un filtre inférieur ou égal à dans le jeu de requêtes Django?

176

J'essaie de filtrer les utilisateurs par un champ personnalisé dans chaque profil d'utilisateurs appelé profil. Ce champ est appelé niveau et est un entier compris entre 0 et 3.

Si je filtre en utilisant des égaux, j'obtiens une liste d'utilisateurs avec le niveau choisi comme prévu:

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

Lorsque j'essaye de filtrer en utilisant moins de:

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

J'obtiens l'erreur:

le nom global 'userprofile__level' n'est pas défini

Existe-t-il un moyen de filtrer par <ou>, ou est-ce que j'aboie dans le mauvais arbre.

Finglish
la source
2
@ BéresBotond Bien que les documents aient fière allure - la structuration et la mise en page sont si médiocres que sans lien direct, elles sont presque inutiles
RunLoop
@ BéresBotond Malheureusement, ce lien est maintenant mort :(
dKen
Lien de travail pour doc: docs.djangoproject.com/en/1.11/ref/models/querysets/#gt
Gaurav Pandey

Réponses:

338

Inférieur ou égal:

User.objects.filter(userprofile__level__lte=0)

Meilleur que ou égal:

User.objects.filter(userprofile__level__gte=0)

De même, ltpour moins de et gtpour plus de. Vous pouvez tous les trouver dans la documentation .

Lakshman Prasad
la source
2
Wow, c'était rapide :). Cela fonctionne très bien pour un prix inférieur ou égal, mais que diriez-vous d'un peu moins que? (userprofile__level__lt = 3) ne semble pas fonctionner
Finglish
1
Cela fait; mais dans tous les cas, vous pouvez également faire exclure (__ gte) au lieu de filter (__ lt).
Lakshman Prasad
2
Et n'oubliez pas qu'il y a deux __soulignements
andilabs
Je reçois cette erreur -> {FieldError} Recherche non prise en charge «niveau» pour AutoField ou rejoindre sur le champ non autorisé.
Aravind R Pillai