Django фильтр по полям, которые могут изменяться
У меня есть эта модель :
class Project(models.Model):
state = models.CharField(max_length=7, default='#FFFF00')
name = models.CharField(max_length=200, default="")
price = models.FloatField(default=0)
decision = models.TextField(blank=True, null=True)
Например, если я хочу отфильтровать все проекты с именем 'hello_project' с ценой 10, я могу сделать следующее :
projects = Project.objects.filter(Q(name='hello_project') & Q(price=10))
Что я хочу сделать, так это фильтровать по спискам, которые могут изменяться :
fields = ["name", "price"]
filters = ["hello_project", 10]
Есть ли способ сделать что-то подобное, что работает? (размер списков может меняться) :
projects = Project.objects.filter(Q({fields[0]}={filters[0]}) & Q({fields[1]}={filters[1]})
Я сделал это:
def get_state(project):
return replace(project.state)
def get_name(project):
return project.name
def get_price(project):
return str(project.price) + "K€"
def get_decision(project):
return project.decision
functions = {
'state': get_state,
'name': get_name,
'price': get_price,
'decision': get_decision
}
def filter_projects(fields, filters):
all_projects = Project.objects.all()
filtered_projects = []
for i in range(len(fields)):
for project in all_projects:
if str(functions[fields[i]](project)) == str(filters[i]):
filtered_projects.append(project)
all_projects = filtered_projects
filtered_projects = []
return all_projects
Это работает, но это очень долго с большим количеством проектов, поэтому я хочу знать, могу ли я сделать это в одной строке
Я рекомендую использовать словарь.
filter_kwargs = {
"name": "hello_project",
"price": 10,
}
projects = Project.objects.filter(**filter_kwargs)