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

Django跨App关联模型报错:执行makemigrations/migrate触发KeyError

解决Django ForeignKey关联时的KeyError: ('cities', 'city')问题

根据你提供的代码和报错信息,这个问题通常是Django无法正确识别关联模型所属的App导致的,以下是几个可行的解决步骤:

1. 确认INSTALLED_APPS配置正确

检查项目根目录下的settings.py文件,确保cities和trains两个App的名称准确添加到INSTALLED_APPS中:

INSTALLED_APPS = [
    # 其他默认App
    'cities',
    'trains',
]

注意:这里的名称要和每个App下apps.py文件中配置类的name属性一致(比如cities/apps.py里的CitiesConfig.name应该是'cities')。

2. 为模型显式指定app_label

如果你的项目目录结构比较特殊(比如App嵌套在src目录下),Django可能无法自动推断模型所属的App。可以在两个模型中添加Meta类指定app_label:

cities/models.py

class City(models.Model):
    name = models.CharField(max_length=40, unique=True, verbose_name='Название города')
    
    class Meta:
        app_label = 'cities'

trains/models.py

class Train(models.Model):
    name = models.CharField(max_length=50, unique=True,
                            verbose_name='Название поезда')
    travel_time = models.PositiveSmallIntegerField(verbose_name='Время в пути')
    from_city = models.ForeignKey('cities.City', related_name='from_city_set',
                                  on_delete=models.CASCADE
                                  )
    to_city = models.ForeignKey('cities.City', related_name='to_city_set',
                                on_delete=models.CASCADE
                                )
    
    class Meta:
        app_label = 'trains'

3. 清理并重新生成迁移文件

如果之前生成过错误的迁移文件,可能会残留问题。执行以下步骤:

  • 删除cities/migrations/和trains/migrations/目录下除了__init__.py之外的所有文件
  • 运行命令重新生成迁移:
python manage.py makemigrations
python manage.py migrate

4. 验证导入路径(如果使用直接导入方式)

如果选择直接导入City模型,确保导入路径正确。如果src是项目的根目录(即manage.py所在目录),那么正确的导入语句应该是:

from cities.models import City

而不是from src.cities.models import City,除非你把src目录添加到了Python的环境变量中。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 15:48:46