Django ORM的“相关数据”加载行为

时间:2010-02-03 01:46:22

标签: python django linq linq-to-sql django-models

在LINQ(我来自C#背景)中,您可以通过Include(“xxx”)方法手动加载相关表的数据

from a in ctx.MainTable.Include("SubTable")
select a;

在上面的代码中,加载了MainTable的每个实例,并且还加载了MainTable.SubTable的所有数据。如果未调用“Include”,则每个返回的MainTable的SubTable属性都将返回null。

Django ORM有相同的方法吗?如果不是,那么像上面这样的情境的默认Django行为是什么?

1 个答案:

答案 0 :(得分:3)

见:

http://docs.djangoproject.com/en/dev/ref/models/querysets/#id4

您创建select_related查询集以跟随关系并预取相关行。

通常,在你知道ORM自动完成的单个提取太慢之前,你不要浪费太多时间。

当您只是命名相关的对象字段时:

x = MainTable.objects.get( id="some Object" )
y= x.subTable

ORM将执行相关的subTable行。懒惰地

您无法轻松地将整个表格提取到内存中。 QuerySets是“懒惰的”,并且在没有可能的借口之前不会获取行。考虑一下。

for m in MainTable.objects.all():
    y = m.subTable
    if y.someAttribute > 5: 
        break

然后您可能实际上不需要MainTable中的所有对象。查询集已准备好提取它们。它实际上并没有全部取出它们。这就是为什么我们通常不会执行x.subTable以外的任何操作,并将其留给ORM来根据需要获取行。

有一段时间你可以证明它太慢了。然后,您可以执行MainTable.objects.select_related()...并强制导航到其他表格中的行。