就我而言,我有一些来自表单的列名。我想过滤以确保它们都是真的。以下是我目前的工作方式:
for op in self.cleaned_data['options']:
cars = cars.filter((op, True))
现在它正常工作但是有可能会有大约40个列进行测试,因此保持查询效率不高。
有没有办法可以将它压缩成一个过滤查询?
答案 0 :(得分:9)
将查询构建为字典,并使用**运算符将选项解压缩为过滤器方法的关键字参数。
op_kwargs = {}
for op in self.cleaned_data['options']:
op_kwargs[op] = True
cars = CarModel.objects.filter(**op_kwargs)
这已在django documentation中介绍,SO也已涵盖。
答案 1 :(得分:3)
Django的查询集是懒惰的,所以你目前所做的实际上非常有效。在您尝试访问QuerySet中的某个字段之前,不会命中数据库...假设,即您没有编辑出某些代码,它实际上是这样的:
cars = CarModel.objects.all()
for op in self.cleaned_data['options']:
cars = cars.filter((op, True))
更多信息here。