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
相关产品推荐
相关产品推荐

