You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django中如何高效跨多个模型查询获取学生所属城市

Django多表关联查询优化方案

你提供的原始查询逻辑会执行3次独立的数据库请求,属于典型的分次查表场景,数据量较大时性能损耗非常明显,可通过Django ORM自带的关联查询特性优化到仅执行1次SQL请求。


方案1:仅需要获取城市数据,直接跨关联反向查询

仅需1次数据库查询即可拿到结果,代码如下:

city = City.objects.filter(city_address__address_student__name="John").first()

说明:这里用到了你模型中定义的related_name做反向关联,双下划线__是Django ORM的跨表查询语法,会自动将City、Address、Student三张表做JOIN查询,直接匹配学生姓名返回关联的城市对象。


方案2:需要同时用到学生、地址、城市的其他数据,用select_related预加载关联数据

同样仅执行1次数据库查询,将所有关联数据一次性加载到内存,后续取关联属性不会再触发新的查询:

# 预加载关联的Address和City数据
student = Student.objects.select_related("address_id", "address_id__city_id").filter(name="John").first()
# 直接通过关联属性拿城市
city = student.address_id.city_id

额外规范提示

你当前模型的外键字段命名不符合Django开发惯例:外键字段无需加_id后缀,Django会自动为外键字段生成带_id后缀的数据库列存储关联主键,你当前的命名会导致后续取主键值时需要写student.address_id_id,很容易出现混淆。

内容的提问来源于stack exchange,提问作者cu__007

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 21:54:07