对。您编写的查询或多或少相当于:
Article.objects.filter(id=some_id).prefetch_related('author')
或:
Article.objects.filter(id=some_id).select_related('author')
select_related
对战
prefetch_related
如果
Author
S是有限的,或者是一对一的关系。万一你拉了很多
Article
还有几个
文章
S映射到
相同的
作者
,通常最好使用
与预取相关
:这将首先查找
作者
标识符,执行一个唯一性过滤器,然后将它们提取到内存中。
如果多个相同
作者
写一篇文章(所以
一对多
或
多对多
关系)。因为那意味着如果我们
JOIN
在数据库级别,我们按照
作者
是谁写的那篇文章,我们重复每一次
作者
按数量
文章
他们写的。对于这样的集合,我们通常希望避免这种“乘法”行为。所以在那种情况下
与预取相关
将有
线性行为
:首先获取相关的
文章
S,接下来获取相关的
作者
S.
延迟加载相关对象
但实际上你不需要
与预取相关
就一个例子来说。如果你载入一篇文章,你可以简单地使用
some_article.author
. 如果
作者
实例尚未加载,django将执行另一个查询来获取相关的
作者
实例。
因此django可以加载与
懒惰的
方式:只需加载
文章
如果你把它记下来,如果你以后需要
作者
,或者
Journal
,或者
.editor
的
学报
(例如
作者
django每次都会创建一个新的查询并加载相关对象。如果您想处理
文章
S批处理,
选择相关的
和
prefect_related
是可取的,因为它们将导致有限数量的查询来获取所有相关对象,而不是每个相关实例一个查询。
如果经常需要获取零个或最多几个相关实例(例如,因为它依赖于
文章
我们是否真的对
作者
毕竟)。