Django查询和加入

时间:2017-02-07 09:22:14

标签: django performance join

我在Django文档中读到,Django查询原则上是懒惰的,即在绝对必要之前不会查询数据库。

现在,作为效率问题,当我通过

检索数据时
FooModel.object.filter(...)

我已经定义了FooModel和BarModel之间的关系,BarModel的信息是否也会自动转发?或者这只会在我稍后引用任何BarModel字段时发生?

相关说明。我一直在寻找一种简单的方法,通过查看日志或使用调试器但无法以某种方式确认这一点。我对如何做到这一点的提示感兴趣。

3 个答案:

答案 0 :(得分:3)

不会自动检索BarModel,如果您通过对象过滤器内的BarModel字段进行过滤,它只会加入并将其用作参数。

如果您对Django运行的查询感兴趣,可以使用以下内容

foo = FooModel.object.filter(...)
print(foo.query) 

要在django中获取额外的表,您应该使用select_related

答案 1 :(得分:0)

如上所述,Django查询和联接是懒惰的。这意味着在你的情况下,除非过滤器查看子表,否则Django不会与子表连接。除非您从代码中访问它,否则它也不会检索子对象的数据。

您可以使用MySQL general query log

针对您的具体情况对此进行验证

答案 2 :(得分:0)

来自docs

  

通常,不从数据库中获取QuerySet的结果   直到你“问”他们

因此,在您明确要求结果数据(即迭代时)之前,您将无法访问数据库。

使用filter(..)意味着只需向SQL查询添加clausules。例如,如果您执行filter(id=2),则只需在SQL查询中添加WHERE id=2

相关问题