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)
Вернуться на верх