Динамическое добавление суффикса поля поиска к полю поиска
В настоящее время у меня есть этот довольно стандартный блок кода в моем файле views.py.
statsign
является значением формы, также как и statinput
.
Поле моей модели, по которому я хочу фильтровать мой набор запросов players
, называется nba_avg_rating
if statsign == '>=' and len(statinput) > 0:
players = players.filter(nba_avg_rating__gte=float(statinput)).order_by(sort)
elif statsign == '<=' and len(statinput) > 0:
players = players.filter(nba_avg_rating__lte=float(statinput)).order_by(sort)
elif statsign == '=' and len(statinput) > 0:
players = players.filter(nba_avg_rating__exact=float(statinput)).order_by(sort)
Как вы можете видеть, в настоящее время моя логика проверяет statsign
на условие, фильтрует по полю модели + суффикс, т.е. >=
приведет к фильтрации по nba_avg_rating__gte
, так далее и так далее.
Моя цель - сделать это динамическим процессом, для чего я объединяю этот процесс в одну строку. У меня есть словарь поиска полей так
field_lookup = {
'>=': '__gte',
'<=': '__lte',
'=': '__exact'
}
Затем я выполняю итерацию, добавляя суффикс к имени поля, в коде, как показано ниже.
for item in field_lookup.items():
if statsign == item[0] and len(statinput) > 0:
players = players.filter((nba_avg_rating + item[1])=float(statinput)).orderby(sort)
Теперь очевидно, что приведенный выше код не работает, потому что nba_avg_rating
- это выражение. Я могу объединить суффикс nba_avg_rating
как строку и затем обернуть его в eval, но, увы, я не могу установить выражение =flost(statinput)
Есть мысли о том, что я могу здесь сделать?
Спасибо
По словам Даниила Ответ.
Вы можете сделать что-то вроде:
if statsign == '>=':
statsign = 'gte'
elif statsign == '<=':
statsign = 'lte'
elif statsign == '=':
statsign = 'exact'
if len(statinput) > 0:
kwargs = {
'{0}__{1}'.format('nba_avg_rating', statsign): float(statinput),
}
Person.objects.filter(**kwargs).orderby(sort)