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

