在Django中使用“.filter()。filter()。filter()...”是否有缺点?

时间:2010-09-17 07:11:02

标签: django django-models django-orm

以下两个调用是否已解析为Django中的等效SQL查询?

链接多个电话

Model.objects \
.filter(arg1=foo) \
.filter(arg2=bar) \
...

将所有参数包装在一起:

Model.objects \
.filter(arg1=foo, arg2=bar)

我希望代码可读(有很多过滤器调用比我所示),但前提是没有牺牲性能。

2 个答案:

答案 0 :(得分:11)

更新

忽略这个答案。更好地看到这一点,correct answer。 感谢@Sam提醒。

旧答案:

  

以下两个调用是否已解析为Django中的等效SQL查询?

简短回答:是的。他们将生成等效的查询。

我用我正在使用的模型验证了这一点。生成的查询功能相同。查询中的filter条件不同AND

  

我希望代码可读(有很多过滤器调用比我所示),但前提是没有牺牲性能。

实现可读性的一种方法是使用字典来收集所有过滤条件。例如,

conditions = dict(arg1 = foo, arg2 = bar, ....)
conditions.update(argN = baz)

Model.objects.filter(**conditions)

答案 1 :(得分:6)

除了Manoj的回答,这里是你如何分析为QuerySet对象生成的sql:

result1 = SomeModel.objects.filter(field1=100, field2=200)
print "Result1", results1.query

result2 = SomeModel.objects.filter(field1=100).filter(field2=200)
print "Result2", result2.query