如何在不删除所有迁移的情况下恢复Django Model中误删的表字段
问题根因
你删除了0006号迁移文件,但Django内置的django_migrations系统表中仍然保留了countries_app的0006迁移已执行完成的记录。此时即使你把population字段加回模型,Django对比当前模型状态和已执行迁移的快照时会判定状态一致,因此返回nothing to migrate。
温和恢复方案(无数据破坏风险)
全程无需删除历史迁移文件,也无需回滚所有迁移,仅需调整迁移记录后生成新迁移即可:
- 第一步:确认你已经在
Country模型中重新添加了正确的population字段定义 - 第二步:执行伪回退操作,仅修改迁移记录不改动业务数据:
该命令的作用是将python manage.py migrate countries_app 0005 --fakecountries_app的已执行迁移标记回滚到0005版本,不会实际操作业务表的数据。 - 第三步:重新生成迁移文件:
此时Django会检测到模型中新增了python manage.py makemigrations countries_apppopulation字段,生成新的0006号迁移文件,内容为新增字段而非之前的删除字段操作。 - 第四步:执行迁移重建字段:
执行完成后检查数据库,即可看到python manage.py migrate countries_apppopulation字段已经恢复,原有业务数据不受任何影响。
注意事项
如果你的字段定义为非空(即null=False),生成迁移时需要按提示输入默认值,否则迁移会创建失败。
内容的提问来源于stack exchange,提问作者ivanleoncz
相关产品推荐
相关产品推荐

