Django(和其他MVC/ORM)中的延迟加载关系

nat*_*ood 5 django model-view-controller orm lazy-loading

有兴趣了解如何在Django等框架中实现延迟加载.什么时候决定进行加入?有没有办法迫使Django急切加载?有时候你需要强迫Django加载吗?

Van*_*ale 12

一般的答案是Django决定在你实际要求记录时执行查询.最常见的是,这意味着迭代queryset(for record in queryset:)或使用list()内置函数将查询集转换为列表.

请参阅何时从官方文档中评估QuerySet的更多细节.

它通过定义一个名为QuerySetin 的类来实现这一点django/db/models/query.py,其中特殊方法类似于__repr__,__getitem__并且__iter__被编码以做正确的事情.

如果你需要强制加载,只需在查询集上运行内置的Python列表函数,如:

qs = SomeModel.objects.all()
ql = list(qs)
Run Code Online (Sandbox Code Playgroud)

此调用list()将执行数据库查询并将所有对象加载到内存中.您需要这样做很少见,但有一种情况是您需要在模板中的多个位置使用查询结果.转换为列表并在模板上下文中传递列表将仅对您迭代的模板中的每个位置执行一次查询,而不是一次.