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

