Получить параметры URL для использования в динамическом фильтре в Django - PullRequest
2 голосов
/ 19 декабря 2011

Рассмотрите этот URL:

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

Для использования в динамическом запросе:

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

Как вставить параметры URL в этот запрос?

Ответы [ 2 ]

7 голосов
/ 19 декабря 2011

Как насчет этого?

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

Или, если вы хотите изменить тип фильтра (например, __contains), вы можете заменить последнюю строку на что-то вроде:

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

Другой вариант, если вы хотите интерпретировать несколько значений для переменной get как OR, это использовать сравнение in:

model = anyModel.objects
for k,vals in request.GET.lists():
    model = model.filter(**{"%s__in" % k: vals})
1 голос
/ 19 декабря 2011

Диспетчер URL не совпадает с параметрами запроса GET , поэтому, если у вас был шаблон URL, например url(r'^get_count$', view, name='get_count'), вы просто переворачиваете URL и добавляете запрос GET, например:

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))

Вы должны сделать это в своем представлении, поскольку оно становится немного сложным для достижения того же в ваших шаблонах, если вы не собираетесь писать статические запросы, такие как:

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

Если вашпытаясь отфильтровать набор запросов динамически, проверяя request.GET в ваших представлениях, тогда я предлагаю вам взглянуть на django-filter.Для его интеграции совсем не требуется времени, и это обезопасит и подтвердит запрос GET, важность которого разработчики часто упускают из виду и вводят дыры в безопасности.Использовать его так же просто, как передать request.GET в определенный фильтр, и вы сразу получите отфильтрованный набор запросов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...