python - 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_related
相对prefetch_related
如果Author
s 的数量有限,或者更多是一对一的关系。如果您拉出大量Article
s,并且几个Article
s 映射到同一个 Author
s ,通常最好使用prefetch_related
:这将首先查找Author
标识符,执行唯一性过滤器,然后将它们提取到内存中。
如果多个Author
s 写一篇文章也是如此(因此是一对多或多对多的关系)。因为这意味着如果我们JOIN
在数据库级别执行 a ,我们会按照Author
写该文章的 s 的数量重复每篇文章,并且按照他们编写Author
的 s 的数量重复每篇Article
文章。我们通常希望避免这种集合的这种“乘法”行为。所以在这种情况下prefetch_related
将具有线性行为:首先获取相关Article
的 s,然后获取相关Author
的 s。
相关对象的延迟加载
但是您实际上不需要prefetch_related
为单个实例执行 a。如果您加载一篇文章,您可以简单地使用some_article.author
. 如果相应的Author
实例还没有加载,Django 将执行一个额外的查询来获取相关的Author
实例。
因此 Django 可以以一种惰性的方式加载与相关对象相对应的属性:Article
如果您在内存中获取它,Author
它只会加载Django 每次都会进行新的查询并加载相关的对象。但是,如果您想批量处理 s列表,建议您这样做,因为它们会导致获取所有相关对象的查询数量有限,而不是每个相关实例一个查询。Journal
.editor
Journal
Author
Article
select_related
prefect_related
如果一个人经常需要获取零个或最多几个相关实例(例如,因为它取决于Article
我们是否真正感兴趣的某些属性),相关对象的延迟加载可能会更有效Author
。
推荐阅读
- arrays - Ruby:从数组中获取连续的元素对
- mysql - 和负整数给出错误的结果
- html - IE11 风格背景色
- html - 如何在标签上设置多个字体以显示文本?
- django - Django:仅当用户提交表单或保存模型时才允许用户进一步访问
- python - AWS Glue 执行者死亡
- c# - Atata:如何跳过 NoSuchElementException?
- docker - 将 filebeat 连接到 Kibana
- jenkins - 如果 Maven 测试失败,如何使声明性 Jenkins 管道失败?
- javascript - 来自 AJAX 的 .NET Core 控制器输入始终为空