Django简单查询中select_related的使用场景及适用接口疑问
问题解答
关于是否需要使用select_related的判断
你的理解完全正确,分两种场景判断即可:
- 如果你当前的序列化器仅返回
OnlineClass模型自身的字段,不需要输出关联Teacher的name、college_name等属性:现有写法是最优的,不需要加select_related。额外加反而会执行不必要的表关联操作,增加数据库查询开销。 - 如果你后续要在序列化结果中展示老师的关联字段:建议加
.select_related('teacher'),否则会触发N+1查询问题(每序列化一个课程对象,都会单独发起一次查询请求获取关联的老师数据),加了之后ORM会通过JOIN语句一次性把课程和对应的老师数据全部查出来,大幅提升查询性能。
补充小提示:你的代码里存在两处笔误需要修正:
Teacher模型的name字段类型错写为OneToOneField,实际应该是CharField,否则运行会报错- 视图中的查询写的是
Class.objects.filter(),但你定义的课程模型名为OnlineClass,需要对应调整
关于select_related适用接口的判断
所谓「select_related仅适用于GET接口、不能用于POST接口」的说法是完全错误的。select_related本质是Django ORM层的查询优化工具,和上层接口的请求方法没有任何绑定关系。无论你的接口是GET、POST、PUT还是其他请求类型,只要你在业务逻辑中需要访问查询结果的外键关联对象属性,都可以用select_related来优化查询性能,例如POST接口中需要批量校验课程关联教师的所属学院权限的场景,同样适合用select_related避免多次数据库查询。
内容的提问来源于stack exchange,提问作者Reactoo
相关产品推荐
相关产品推荐

