Django迁移执行顺序异常:数据迁移晚于模型删除迁移报错
问题原因分析
Django 迁移的执行顺序由依赖关系和应用在INSTALLED_APPS中的顺序共同决定:
app1.app1_0002(删除模型M的迁移)仅依赖app1.app1_0001,未声明依赖app2.app2_0001;app2.app2_0001仅依赖app1.app1_0001;- 由于
app1在INSTALLED_APPS中的顺序大概率早于app2,Django会优先执行app1下的所有迁移(先0001再0002),之后才执行app2的0001——此时模型M已被app1_0002删除,因此触发LookupError。
解决方案
方案一:修复迁移依赖关系
修改app1/migrations/app1_0002.py的dependencies,添加对app2.app2_0001的依赖,确保删除模型的迁移在数据迁移之后执行:
class Migration(migrations.Migration): dependencies = [ ('app1', 'app1_0001'), ('app2', 'app2_0001'), # 新增依赖 ] operations = [ migrations.DeleteModel(name='M'), ]
方案二:合并迁移(适合开发阶段)
若项目仍在开发期,可合并相关迁移以避免依赖混乱:
- 删除
app1和app2下的所有迁移文件(保留migrations/__init__.py); - 清空数据库中的
django_migrations表(仅测试环境操作); - 重新生成并执行迁移:
python manage.py makemigrations python manage.py migrate
方案三:移除无用的app2迁移
既然已彻底删除模型M,app2.app2_0001这个数据迁移已无意义,可直接删除该文件,测试环境下重新运行测试会自动跳过对应迁移记录。
内容的提问来源于stack exchange,提问作者michal111
相关产品推荐
相关产品推荐

