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

Django ORM多表关联查询问题:如何获取三级关联字段数据?

嘿,我来帮你搞定这个Django关联查询的问题!

首先你得知道,你写的address__city__name这个关联路径本身是完全正确的——毕竟你的Person关联Address,Address又关联City,这种双下划线的跨表查询是Django ORM的标准用法。那为啥会报错呢?大概率是这两个小问题:要么你还没执行数据库迁移,要么是某个字段名拼写出错了。

先给你最直接的解决方案,先确保数据库迁移完成:

python manage.py makemigrations
python manage.py migrate

然后用优化后的查询代码(加上select_related避免多次查数据库的N+1问题):

# 一次性关联查询Person、Address和City,高效获取所需字段
smiths_data = Person.objects.filter(surname='Smith').select_related('address__city').values(
    'name',
    'birthdate',
    'address__name',
    'address__city__name'
)

执行这段代码后,你就能得到包含姓名、出生日期、街道名称、城市名称的字典列表了。

如果还是报错,你可以排查这几点:

  • 确认Address模型里的city字段确实关联了City模型
  • 检查City模型里是不是真的有name字段(看你的代码是有的,不过再确认下拼写)
  • 有没有把address写成adress这类拼写错误

另外,如果你觉得返回的键名(比如address__name)不够友好,还可以给字段起别名:

from django.db.models import F

smiths_data = Person.objects.filter(surname='Smith').select_related('address__city').values(
    'name',
    'birthdate',
    street_name=F('address__name'),
    city_name=F('address__city__name')
)

这样返回的字典里就会用street_name和city_name作为键,可读性更强。

要是你更倾向于操作模型实例而不是字典,也可以这么写:

smiths = Person.objects.filter(surname='Smith').select_related('address__city')
for person in smiths:
    print(f"{person.name} | {person.birthdate} | {person.address.name} | {person.address.city.name}")

这种方式代码更直观,也能拿到所有需要的数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:53:57