我来自.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_related
与 prefetch_related
如果Author
s的数量有限,或者是一对一的关系。如果您拉出大量的Article
s,并且将多个Article
s映射到同一个 Author
,通常最好使用prefetch_related
:这将首先查找Author
标识符,执行唯一性过滤器,然后将其提取到内存中。
如果多个人Author
撰写一篇文章(所以一对多或多对多关系),也是如此。因为那意味着如果我们JOIN
在数据库级别执行a ,则每篇文章都重复Author
撰写该文章的s的数目,而每篇文章重复其撰写Author
的Article
s的数目。对于这些集合,我们通常希望避免这种“乘法”行为。因此,在这种情况下prefetch_related
将具有线性行为:首先获取相关的Article
s,然后获取相关的Author
s。
但是实际上您不需要prefetch_related
为单个实例执行。如果您要加载文章,则只需使用即可some_article.author
。如果Author
尚未加载相应的实例,则Django将执行附加查询以获取相关Author
实例。
这样的Django可以加载属性,这些属性对应于一个相关对象懒惰方式:它简单地加载Article
如果在存储器中获取它,如果以后需要的Author
,或Journal
,或.editor
的Journal
(这是例如一个Author
为好), Django每次都会进行新查询并加载相关对象。但是如果你要处理的列表Article
S IN批次,select_related
并且prefect_related
是可取的,因为它们会导致查询数量有限获取的,而不是按有关例如一个查询所有相关的对象。
如果经常需要获取零个或最多几个相关实例(例如,这取决于Article
我们是否真正感兴趣Author
)的某些属性,则相关对象的延迟加载会更有效。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句