我来自.NET Core,我很好奇Django是否有类似于.NET Core的预测。例如,我可以在.NET Core模型中描述关系,然后再查询它。因此,如果Articles
可以有Author
,我可以执行以下操作:
var articles = dbContext.Where(article.ID == id).Inclue(a => a.author);
我会得到的是附有作者的文章。
Django有类似的东西吗?如何在Django中加载模型中描述的相关数据?
答案 0 :(得分:3)
听起来像是在寻找select_related。这将根据FK关系在模型中的创建方式进行遍历。
答案 1 :(得分:2)
是。您编写的查询或多或少等同于:
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
,通常最好使用{{1} }:这将首先查找prefetch_related
标识符,执行单一过滤器,然后将其提取到内存中。
如果多个Author
写一篇文章(所以一对多或多对多关系),同样成立。因为那意味着如果我们在数据库级别执行Author
,我们会按照撰写该文章的JOIN
的数量重复每篇文章,并按编号重复每个Author
他们写的是Author
。我们通常希望避免这种"乘法"这些集合的行为。因此,在这种情况下,Article
将具有线性行为:首先获取相关的prefetch_related
,然后获取相关的Article
。
但实际上您不需要为单个实例执行Author
。如果您加载文章,只需使用prefetch_related
即可。如果尚未加载相应的some_article.author
实例,Django将执行另一个查询以获取相关的Author
实例。
因此Django可以以 lazy 的方式加载与相关对象相对应的属性:如果你在内存中获取它,它只是加载Author
,如果你以后需要{{1 }},或者Article
或Author
的{{1}}(例如也是Journal
),Django每次都会进行新的查询和加载相关对象。如果您希望批量处理.editor
列表,建议使用Journal
和Author
,因为它们会导致查询所有相关对象的查询数量有限,每个相关实例的一个查询。
如果经常需要获取零或最多几个相关实例,则相关对象的延迟加载可以更有效(例如,因为它取决于Article
的某些属性我们是否真的对毕竟select_related
。