为何在迁移中使用已删除的Django模型有时会报错?
Django迁移时找不到已删OldModel的问题解决
1. 盯紧迁移依赖顺序
别让你的迁移脚本依赖后续删除OldModel的迁移。要是迁移链里当前脚本之后的迁移已经删了这个模型,或者依赖了删它的迁移,apps对象肯定找不到OldModel。生成迁移时用makemigrations --name migrate_old_data明确命名,然后手动检查dependencies列表,只依赖到包含OldModel的最后一个迁移就行,别把删模型的迁移加进去。
2. 绝对别直接导入模型
不管是函数外部还是内部,都别写from myapp.models import OldModel,必须用apps.get_model('myapp', 'OldModel')从迁移上下文里拿模型。
错误写法:
from myapp.models import OldModel def migrate_data(apps, schema_editor): for obj in OldModel.objects.all(): # 迁移逻辑
正确写法:
def migrate_data(apps, schema_editor): OldModel = apps.get_model('myapp', 'OldModel') NewModel = apps.get_model('myapp', 'NewModel') for obj in OldModel.objects.all(): NewModel.objects.create( field1=obj.field1, field2=obj.field2 )
3. 检查操作顺序和脚本修改
要是你把数据迁移和删模型放在同一个迁移里,必须先跑RunPython迁移数据,再执行DeleteModel操作。顺序反了先删模型,apps里自然没OldModel了,肯定报错。正确的操作列表应该是:
operations = [ migrations.RunPython(migrate_data), migrations.DeleteModel(name='OldModel'), ]
4. 清缓存或拆分迁移
有时候Django的迁移缓存会搞鬼,试试删掉__pycache__里的迁移缓存文件,或者重新生成迁移脚本。要是还是有问题,干脆把数据迁移和删模型拆成两个独立迁移:先做一个只跑数据迁移的,再做一个专门删OldModel的,分开执行能避免状态切换的冲突。
5. 核对数据库迁移记录
看看django_migrations表,确认已执行的迁移和本地脚本一致。要是之前手动改过迁移记录,容易导致Django加载错误的模型状态。如果记录不对,回滚到还包含OldModel的迁移版本,重新执行数据迁移和删除操作。
内容的提问来源于stack exchange,提问作者odigity
相关产品推荐
相关产品推荐

