Вы можете использовать словарь для распаковки [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
и, таким образом, начать пытаться выяснить, какие электронные письма находятся в базе данных, сгенерировав большое количество запросов и каждый раз просматривая, какие значения вернул этот запрос.