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

Django(和其他MVC/ORM)中的延迟加载关系,django,model-view-controller,orm,lazy-loading,Django,Model View Controller,Orm,Lazy Loading,有兴趣了解Django之类的框架是如何实现延迟加载的。何时决定执行联接?有没有办法在Django强制加载?是否有时需要强制Django立即加载?一般的答案是,Django会在您实际请求某些记录时决定执行查询。最常见的情况是,这意味着迭代queryset(以获取queryset中的记录:)或使用list()内置函数将queryset转换为列表 有关官方文件的更多详细信息,请参阅 它通过在django/db/models/query.py中定义一个名为QuerySet的类来实现这一点,在这个类中,像

有兴趣了解Django之类的框架是如何实现延迟加载的。何时决定执行联接?有没有办法在Django强制加载?是否有时需要强制Django立即加载?

一般的答案是,Django会在您实际请求某些记录时决定执行查询。最常见的情况是,这意味着迭代queryset(
以获取queryset中的记录:
)或使用
list()
内置函数将queryset转换为列表

有关官方文件的更多详细信息,请参阅

它通过在
django/db/models/query.py
中定义一个名为
QuerySet
的类来实现这一点,在这个类中,像
\uuuuu repr\uuuuu
\uuuu item\uuuuuuuu
这样的特殊方法被编码来做正确的事情

如果需要强制加载,只需在queryset上运行内置的Python list函数,如:

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