2 votes

Obtenir des paramètres d'url pour les utiliser dans un filtre dynamique dans django

Prenons l'exemple de l'url :

www.anysite.com/get_count/?sex=5&sex=6&city=5&city=7&job=7&job=8......

Pour l'utilisation d'une requête dynamique dans la vue :

model = anyModel.objects.filter(sex=5).filter(sex=6).filter(city=5)....

Comment puis-je insérer des paramètres d'url dans cette requête ?

7voto

redShadow Points 3858

Que diriez-vous de quelque chose comme ceci ?

model = anyModel.objects
for k,vals in request.GET.lists():
    for v in vals:
        model = model.filter(**{k: v})

Ou, si vous voulez changer le type de filtre, (à, par exemple, __contains ), vous pouvez remplacer la dernière ligne par quelque chose comme :

        model = model.filter(**{"%s__contains" % k: v})

Une autre solution consiste à interpréter les valeurs multiples d'une variable get comme une variable OR est d'utiliser l'outil in comparaison :

model = anyModel.objects
for k,vals in request.GET.lists():
    model = model.filter(**{"%s__in" % k: vals})

1voto

Filip Dupanović Points 10071

Le distributeur d'URL ne correspond pas aux paramètres de la requête GET Ainsi, si vous avez un modèle d'URL tel que url(r'^get_count$', view, name='get_count') Il suffit alors d'inverser l'URL et d'ajouter la requête GET, par exemple :

from django.core.urlresolvers import reverse
from urllib import urlencode

query = (('sex', 5), ('sex', '6'), ('city', 5), ('city', 7))
url = `%s?%s` % (reverse('get_count'), urlencode(query))

Vous devriez le faire dans votre vue, car il est un peu compliqué de faire la même chose dans vos modèles, à moins que vous n'écriviez des requêtes statiques, comme par exemple :

{% url 'get_content' %}?sex=5&sex=6&city=5&city=7

Si vous essayez de filtrer un ensemble de requêtes de manière dynamique en inspectant les éléments suivants request.GET dans votre optique, je vous suggère de jeter un coup d'œil à django-filter . Son intégration ne prend que peu de temps et il permet d'assainir et de valider la requête GET, dont l'importance est souvent négligée par les développeurs, ce qui introduit des failles de sécurité. L'utiliser est aussi simple que de passer request.GET à votre filtre défini et vous obtiendrez immédiatement le jeu de requêtes filtré.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X