Django установка поля фильтра с переменной - PullRequest
1 голос
/ 06 июня 2019

Я показываю модель продаж, которая может быть агрегирована по разным полям через форму.Продукты, клиенты, категории и т. Д.

view_by_choice = filter_opts.cleaned_data["view_by_choice"]

sales = sales.values(view_by_choice).annotate(........).order_by(......)

В той же форме у меня есть строковый ввод, где пользователь может фильтровать результаты.Например, по «коду продукта».

input_code = filter_opts.cleaned_data["filter_code"]

sales = sales.filter(prod_code__icontains=input_code)

Что я хочу сделать, так это отфильтровать набор запросов «продажи» по входному коду, динамически определяя поле из переменной view_by_choice.

Что-то вроде:

sales = sales.filter(VARIABLE__icontains=input_code)

Возможно ли это сделать?Заранее спасибо.

1 Ответ

1 голос
/ 06 июня 2019

Вы можете использовать словарь для распаковки [PEP-448] здесь:

sales = sales.filter(
    <b>**{</b>'{}__icontains'.format(view_by_choice): input_code<b>}</b>
)

Учитывая, что view_by_choice, например, содержит 'foo',таким образом, сначала мы создаем словарь { 'foo__icontains': input_code }, а затем распаковываем его как именованный параметр с двумя последовательными звездочками (**).

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

Например, если в вашей модели есть ForeignKey с именем owner для модели Userон / она может использовать owner__email и, таким образом, начать пытаться выяснить, какие электронные письма находятся в базе данных, сгенерировав большое количество запросов и каждый раз просматривая, какие значения вернул этот запрос.

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