“使用”是否有缺点;。过滤器().filter().filter()…”;在Django?

“使用”是否有缺点;。过滤器().filter().filter()…”;在Django?,django,django-models,django-orm,Django,Django Models,Django Orm,以下两个调用是否解析为Django中的等效SQL查询 链接多个呼叫 Model.objects \ .filter(arg1=foo) \ .filter(arg2=bar) \ ... 将所有参数包装在一起: Model.objects \ .filter(arg1=foo, arg2=bar) 我希望代码具有可读性(比我所展示的过滤器调用多得多),但前提是不牺牲性能。更新: 不要理会这个答案。请看清楚这一点。 谢谢你的提醒 旧答案: 以下两个调用是否解析为Django中的等效SQL查询

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

链接多个呼叫

Model.objects \
.filter(arg1=foo) \
.filter(arg2=bar) \
...
将所有参数包装在一起:

Model.objects \
.filter(arg1=foo, arg2=bar)
我希望代码具有可读性(比我所展示的过滤器调用多得多),但前提是不牺牲性能。

更新: 不要理会这个答案。请看清楚这一点。 谢谢你的提醒

旧答案: 以下两个调用是否解析为Django中的等效SQL查询

简短回答:是的。它们将生成等价的查询

我用我正在使用的模型验证了这一点。生成的查询在功能上是相同的。不同的
过滤器
条件在查询中被
合并在一起

我希望代码是可读的(有比我展示的更多的过滤器调用),但前提是不牺牲性能

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

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

Model.objects.filter(**conditions)

除了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

assert
语句可能不是每次都有效。当我尝试时,
子句在生成的查询中的顺序是不同的。是的,你说得对,只是测试了一下。从答案中删除断言。这对于多值关系是不正确的。在适当的条件下,它们将生成具有不同结果的不同查询。请参阅此答案和链接文档-这是否回答了您的问题?