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

如何用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')

关联逻辑与双向访问说明

  1. 一对多关系的实现
    Django 确实没有单独的 OneToMany 字段,但可以通过在关系中“多”的一端添加 ForeignKey 来实现一对多关联:
  • 一个国家对应多个州 → 在State模型中添加ForeignKey关联Country
  • 一个州对应多个城市 → 在City模型中添加ForeignKey关联State
  1. 双向访问的实现
    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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 22:04:50