“使用”是否有缺点;。过滤器().filter().filter()…”;在Django?
以下两个调用是否解析为Django中的等效SQL查询 链接多个呼叫“使用”是否有缺点;。过滤器().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查询
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
语句可能不是每次都有效。当我尝试时,和
子句在生成的查询中的顺序是不同的。是的,你说得对,只是测试了一下。从答案中删除断言。这对于多值关系是不正确的。在适当的条件下,它们将生成具有不同结果的不同查询。请参阅此答案和链接文档-这是否回答了您的问题?