django-safedelete 1.3.0迁移失败求助:新增字段后无法执行migrate
Django-safedelete升级后迁移失败的修复方案
关键结论
完全可以在makemigrations生成迁移文件后、执行migrate前修改迁移文件,这是解决这类字段冲突问题的常规操作,具体步骤如下:
1. 生成迁移文件
先执行命令生成迁移文件(手动给数据库加过deleted_by_cascade字段后,这一步应该能成功):
python manage.py makemigrations
2. 编辑迁移文件
找到刚生成的迁移文件(比如0087_xxxx.py),打开后删除其中新增deleted_by_cascade字段的操作代码,只保留你原本要添加的业务字段的迁移逻辑。
举个例子,原迁移文件可能是这样:
operations = [ migrations.AddField( model_name='ltqmappsetting', name='deleted_by_cascade', field=models.BooleanField(default=False), ), migrations.AddField( model_name='ltqmappsetting', name='your_custom_field', field=models.IntegerField(null=True), ), ]
修改后只保留你的业务字段操作:
operations = [ migrations.AddField( model_name='ltqmappsetting', name='your_custom_field', field=models.IntegerField(null=True), ), ]
3. 同步迁移状态(可选)
由于你已经手动在数据库添加了deleted_by_cascade字段,但Django的迁移记录里没有这个操作,可能会导致后续迁移报错。可以用--fake参数让Django标记该字段的迁移已完成:
# 如果能找到django-safedelete对应的迁移文件,指定文件名fake python manage.py migrate --fake gestion 00xx_xxx_deleted_by_cascade # 找不到的话,直接fake整个app的当前迁移状态 python manage.py migrate --fake gestion
4. 执行迁移
最后执行迁移命令即可完成:
python manage.py migrate
额外提示
- 这次问题的根源是django-safedelete升级后新增了
deleted_by_cascade字段,但你的数据库在升级前没有该字段,导致迁移逻辑和手动操作冲突 - 确认所有使用safedelete的模型都正确继承了对应的基类(如
SafeDeleteModel),避免模型字段不一致引发的异常
内容的提问来源于stack exchange,提问作者Jm Lamotte
相关产品推荐
相关产品推荐

