Django获取外键对象

塞滕

我来自.NET Core,我很好奇Django是否具有类似于.NET Core的预测。例如,我可以在.NET Core模型中描述一个关系,然后在以后查询它。因此,如果Articles可以的话,Author我可以做类似的事情:

var articles = dbContext.Where(article.ID == id).Inclue(a => a.author);

我会回想的是附有作者的文章。

Django中有与此类似的东西吗?如何在模型中描述的Django中加载相关数据?

威廉·范昂塞姆

是。您编写的查询或多或少等于:

Article.objects.filter(id=some_id).prefetch_related('author')

要么:

Article.objects.filter(id=some_id).select_related('author')

select_relatedprefetch_related

如果Authors的数量有限,或者是一对一的关系。如果您拉出大量的Articles,并且将多个Articles映射到同一个 Author,通常最好使用prefetch_related:这将首先查找Author标识符,执行唯一性过滤器,然后将其提取到内存中。

如果多个人Author撰写一篇文章(所以一对多多对多关系),也是如此。因为那意味着如果我们JOIN在数据库级别执行a ,则每篇文章都重复Author撰写该文章s的数目,而每篇文章重复其撰写AuthorArticles的数目对于这些集合,我们通常希望避免这种“乘法”行为。因此,在这种情况下prefetch_related将具有线性行为:首先获取相关的Articles,然后获取相关的Authors。

延迟加载相关对象

但是实际上您不需要prefetch_related为单个实例执行如果您要加载文章,则只需使用即可some_article.author如果Author尚未加载相应的实例,则Django将执行附加查询以获取相关Author实例。

这样的Django可以加载属性,这些属性对应于一个相关对象懒惰方式:它简单地加载Article如果在存储器中获取它,如果以后需要的Author,或Journal,或.editorJournal(这是例如一个Author为好), Django每次都会进行新查询并加载相关对象。但是如果你要处理的列表ArticleS IN批次,select_related并且prefect_related是可取的,因为它们会导致查询数量有限获取的,而不是按有关例如一个查询所有相关的对象。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章