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

为何在迁移中使用已删除的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 12:15:38