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

3 投票
1 回答
2598 浏览
提问于 2025-04-15 18:49

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

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

在上面的代码中,MainTable的每一个实例都会被加载,同时MainTable.SubTable的所有数据也会被加载。如果不调用"Include",那么返回的每个MainTable的SubTable属性都会是空的。

在Django的ORM中有没有类似的方法?如果没有,Django在这种情况下的默认行为是什么呢?

1 个回答

4

看看这个:

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

你可以创建一个 select_related 查询集,这样可以跟踪关系并提前获取相关的数据行。

通常情况下,你不会太在意这个,直到你发现ORM(对象关系映射)自动获取的单个数据太慢了。

当你简单地提到一个相关对象的字段时:

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

ORM会懒懒地处理相关的子表数据行。

你不能轻易地把整个表的数据都加载到内存里。查询集是“懒惰”的,直到没有其他理由,它才会去获取数据行。想想这个。

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

那么你可能并不需要 MainTable 中的所有对象。查询集已经准备好去获取它们,但实际上并不会一次性获取所有数据。这就是为什么我们通常只使用 x.subTable,然后让ORM根据需要去获取数据行。

偶尔你会发现这样做太慢了。那时候你可以使用 MainTable.objects.select_related()... 来强制获取其他表中的数据行。

撰写回答