В моем случае у меня есть несколько имен столбцов, поступающих из формы. Я хочу отфильтровать, чтобы убедиться, что все они верны. Вот как я сейчас это делаю:
for op in self.cleaned_data['options']:
cars = cars.filter((op, True))
Теперь это работает, но есть возможное ~ 40 столбцов, которые нужно протестировать, и поэтому продолжать запросы не очень эффективно.
Есть ли способ объединить это в один запрос фильтра?






Создайте запрос как словарь и используйте оператор **, чтобы распаковать параметры в качестве аргументов ключевого слова для метода фильтрации.
op_kwargs = {}
for op in self.cleaned_data['options']:
op_kwargs[op] = True
cars = CarModel.objects.filter(**op_kwargs)
Это описано в документация django, а также в ТАК.
Наборы запросов Django ленивы, поэтому то, что вы сейчас делаете, на самом деле довольно эффективно. База данных не будет затронута, пока вы не попытаетесь получить доступ к одному из полей в QuerySet ... при условии, что вы не редактировали какой-то код, и это примерно так:
cars = CarModel.objects.all()
for op in self.cleaned_data['options']:
cars = cars.filter((op, True))
Дополнительная информация здесь.
Это довольно эффективно (не попадает в базу данных повторно), но по-прежнему приводит к многократному клонированию набора запросов, поэтому решение Prairie Dogg (создать словарь и передать его как kwargs) будет несколько быстрее.