Django获取外键对象

时间:2018-06-04 21:48:19

标签: python django python-3.x django-models

我来自.NET Core,我很好奇Django是否有类似于.NET Core的预测。例如,我可以在.NET Core模型中描述关系,然后再查询它。因此,如果Articles可以有Author,我可以执行以下操作:

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

我会得到的是附有作者的文章。

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

2 个答案:

答案 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_relatedprefetch_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 }},或者ArticleAuthor的{​​{1}}(例如也是Journal),Django每次都会进行新的查询和加载相关对象。如果您希望批量处理.editor列表,建议使用JournalAuthor,因为它们会导致查询所有相关对象的查询数量有限,每个相关实例的一个查询。

如果经常需要获取零或最多几个相关实例,则相关对象的延迟加载可以更有效(例如,因为它取决于Article的某些属性我们是否真的对毕竟select_related