仅访问关联模型PK时,Django是否会触发额外数据库查询?
问题解答
不会触发额外的SQL查询。
原因很简单:Django的外键字段在数据库层面本身就存储着关联对象的主键值。当你执行myApple = Apple.objects.get(pk=pk)时,这个外键值(也就是Banana的PK)已经被查询出来并加载到了Apple实例的内存中。
当你调用myApple.banana.pk时,Django并不会去查询Banana表——它直接返回已经存在于Apple实例里的外键值。你可以理解为,Django在这里做了个快捷处理:因为banana.pk本质上就是Apple表中存储的外键字段值,完全不需要额外去关联表取数据。
只有当你访问Banana实例的其他非主键字段时(比如myApple.banana.name),Django才会触发额外的SQL查询去拉取Banana表的对应数据。
至于.select_related(),确实没必要在这里使用——它的作用是提前关联查询外键对应的整个对象,避免后续访问对象时的额外查询,但你这里只需要主键值,而这个值已经随Apple的初始查询拿到了。
内容的提问来源于stack exchange,提问作者BookofMorten
相关产品推荐
相关产品推荐

