Как применить фильтры из словаря, содержащего строковые и списковые значения в django? - PullRequest
2 голосов
/ 28 мая 2020

У меня есть фильтры типа dict:

    "filter1": "string",
    "filter2": [
      "A","B"
    ],
    "filter3": "string",
    "filter4": [
      "C","D"
    ],
  }

где filter1, filter2, filter3 filter4 - некоторые поля в моей модели.

Этот query_set = query_set.filter(**filters) отлично работает для всех фильтров чей тип не является списком,

Но я хочу отфильтровать query_set как можно более чисто. Как применить фильтры, используя dict, который содержит как строковые, так и списковые значения?

PS: I знаю о __in и знаю, что я могу сделать что-то вроде

filter2_list = filters.get(filter2) 
if filter2_list:
   query_set = query_set.filter(filter2__in=filter2_list)

Но, 1. Я не хочу использовать операторы if-else 2. Я хочу иметь переменные Dynami c в аргументах фильтров и не хардкорные вроде filter2__in

1 Ответ

2 голосов
/ 28 мая 2020

Ну, это ни в коем случае не очень чистый способ, но вы можете обойтись, просто перебрав ваши фильтры один раз, проверяя, список это или нет.

new_filters = {}
for key,value in f.items():
     new_filters[f"{key}__in" if isinstance(value,list) else key] = value
query_set = query_set.filter(**new_filters)
...