Django ORM能否直接通过ID赋值外键以省去关联表查询步骤
问题解答
你提到的写法完全合法,是Django官方支持的标准操作,确实可以省去查询Book表的SQL请求,在你已经确认关联ID有效的前提下非常推荐使用。
原理说明
Django定义ForeignKey字段时,会自动在模型中同步生成[外键字段名]_id的属性,对应数据库中真实存储关联主键值的物理列。你直接对author.book_id赋值合法的整数ID后,调用save()方法时会直接将该ID写入对应数据库列,全程不需要和Book表做交互。
注意事项
- 你需要确保赋值的ID确实在Book表中存在,否则后续访问
author.book关联对象时会抛出Book.DoesNotExist异常,你题目中已经明确可以确认ID对应记录存在,因此完全无需担心这个问题。 - 如果你赋值后立即需要访问
author.book的其他属性(比如书名),此时Django还是会触发一次查询拉取Book实例,这种场景下提前查询实例赋值不会产生额外开销。 - 批量创建/更新大量Author数据时,这种写法的性能提升会非常显著,能避免大量冗余的关联表查询。
内容的提问来源于stack exchange,提问作者senaps
相关产品推荐
相关产品推荐

