繁体   English   中英

Django获取外键对象

[英]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_relatedprefetch_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_relatedprefect_related是可取的,因为它们会导致有限数量的查询来获取所有相关的对象,而不是每个相关实例一个查询。

如果经常要获取零个或最多几个相关实例,则相关对象的延迟加载会更有效(例如,因为毕竟我们是否真的对Author感兴趣,这取决于Article某些属性)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM