如何用Django Model建立Country、State、City的双向关联?
Django 实现 Country/State/City 一对多关联建模
修正后的正确模型代码
from django.db import models class Country(models.Model): name = models.CharField(max_length=100) # CharField必须指定max_length参数 class State(models.Model): name = models.CharField(max_length=100) # 关联Country,on_delete定义删除国家时的级联规则 country = models.ForeignKey(Country, on_delete=models.CASCADE, related_name='states') class City(models.Model): name = models.CharField(max_length=100) # 关联State,related_name自定义反向关联的属性名 state = models.ForeignKey(State, on_delete=models.CASCADE, related_name='cities')
关联逻辑与双向访问说明
- 一对多关系的实现
Django 确实没有单独的OneToMany字段,但可以通过在关系中“多”的一端添加ForeignKey来实现一对多关联:
- 一个国家对应多个州 → 在State模型中添加ForeignKey关联Country
- 一个州对应多个城市 → 在City模型中添加ForeignKey关联State
- 双向访问的实现
Django 会自动为ForeignKey生成反向关联属性,也可以通过related_name自定义更直观的名称:
- 从城市访问所属州:
city.state - 从州访问下属所有城市:
state.cities.all()(因为设置了related_name='cities') - 从州访问所属国家:
state.country - 从国家访问下属所有州:
country.states.all()(因为设置了related_name='states')
如果不设置related_name,Django会默认生成模型名小写_set的反向属性,比如国家访问下属州会是country.state_set.all(),效果完全一致,只是名称不同。
你原代码中的两处错误
- State模型的
country字段错误关联到了City,应该关联Country - City模型的字段名写成了大写的
State,不符合Python变量命名规范,应改为小写的state
内容的提问来源于stack exchange,提问作者Lorteau Erwan
相关产品推荐
相关产品推荐

