在Django中使用".filter().filter().filter()..."是否有缺点?

the*_*man 7 django django-models django-orm

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

链接多个电话

Model.objects \
.filter(arg1=foo) \
.filter(arg2=bar) \
...
Run Code Online (Sandbox Code Playgroud)

把所有的args包装在一起:

Model.objects \
.filter(arg1=foo, arg2=bar)
Run Code Online (Sandbox Code Playgroud)

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

Man*_*dan 11

更新:

无视这个答案.看到这个更好,正确的答案.谢谢@Sam的提醒.

旧答案:

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

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

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

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

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

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

Model.objects.filter(**conditions)
Run Code Online (Sandbox Code Playgroud)

  • 这对于多值关系来说是不正确的.在适当的条件下,他们将生成具有*不同*结果的*不同*查询.请参阅此答案和链接的文档 - http://stackoverflow.com/a/8164920 (7认同)

Sam*_*lan 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
Run Code Online (Sandbox Code Playgroud)

  • `assert`语句可能每次都不起作用.当我尝试时,生成的查询中的`AND`子句的顺序是不同的. (2认同)