[英]Django get foreign key objects
我来自.NET Core,我很好奇Django是否具有与.NET Core相似的东西。 例如,我可以在.NET Core模型中描述一个关系,然后在以后查询它。 因此,如果Articles
可以有Author
,那么我可以执行以下操作:
var articles = dbContext.Where(article.ID == id).Inclue(a => a.author);
我会回想的是附有作者的文章。
Django中有与此类似的东西吗? 如何在模型中描述的Django中加载相关数据?
听起来您正在寻找select_related 。 这将基于在模型中如何创建FK关系来进行遍历。
是。 您编写的查询或多或少等于:
Article.objects.filter(id=some_id).prefetch_related('author')
要么:
Article.objects.filter(id=some_id).select_related('author')
select_related
与prefetch_related
如果Author
的数量有限,或者是一对一的关系。 如果您提取大量Article
并将多个Article
映射到相同的 Author
,通常最好使用prefetch_related
:这将首先查找Author
标识符,执行唯一性过滤器,然后将其提取到内存中。
如果多个Author
撰写一篇文章( 即一对多或多对多关系),也是如此。 因为这将意味着,如果我们执行JOIN
在数据库级别上,我们重复的每一篇文章的数量Author
是谁写的文章s和我们重复每个Author
通过数量Article
就是他们写道。 对于这些集合,我们通常希望避免这种“乘法”行为。 因此,在这种情况下, prefetch_related
将具有线性行为 :首先获取相关的Article
,然后获取相关的Author
。
但是您实际上不需要为单个实例执行prefetch_related
。 如果您加载文章,则只需使用some_article.author
。 如果尚未加载相应的Author
实例,则Django将执行附加查询以获取相关的Author
实例。
所以Django的可加载对应于一个懒惰的方式相关对象的属性:它只是加载Article
,如果你在内存中读取它,如果你以后需要的Author
,或者Journal
,或者.editor
的的Journal
(这是例如Author
),Django每次都会进行新查询并加载相关的对象。 如果你想不过来处理列表Article
S IN批次, select_related
和prefect_related
是可取的,因为它们会导致有限数量的查询来获取所有相关的对象,而不是每个相关实例一个查询。
如果经常要获取零个或最多几个相关实例,则相关对象的延迟加载会更有效(例如,因为毕竟我们是否真的对Author
感兴趣,这取决于Article
某些属性)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.