查询Django中动态列数的更清洁方法?

时间:2008-12-09 17:00:26

标签: python django

就我而言,我有一些来自表单的列名。我想过滤以确保它们都是真的。以下是我目前的工作方式:

for op in self.cleaned_data['options']:
    cars = cars.filter((op, True))

现在它正常工作但是有可能会有大约40个列进行测试,因此保持查询效率不高。

有没有办法可以将它压缩成一个过滤查询?

2 个答案:

答案 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