Django重命名M2M中间模型后持续重复生成AlterField迁移问题
问题根因
你遇到的重复生成迁移的核心原因是Django的迁移记录中,多对多字段的through参数关联的旧模型名没有同步更新:
- Django执行
RenameModel操作时,只会自动更新直接关联字段的引用,不会主动更新多对多字段的through参数的历史引用记录 - 你在现有迁移里没有同步更新
admins多对多字段的through指向,导致Django每次运行makemigrations时,对比当前代码里的through=BusinessMember和迁移历史里存储的旧模型名BusinessUser,会判定为字段变更,重复生成AlterField操作。
解决方案
方案一:开发环境未上线的回滚方案
- 首先删除所有自动生成的重复
AlterField迁移文件,确保当前迁移队列没有冗余文件 - 手动修改你之前的
0011_rename_business_user_model.py迁移文件,在operations列表里新增AlterField操作,放在RenameModel之后:
operations = [ migrations.RenameModel("businessuser", "businessmember"), migrations.AlterModelTable( name="businessmember", table="myproject__business_member", ), # 新增这段代码同步更新多对多字段的through指向 migrations.AlterField( model_name='business', name='admins', field=models.ManyToManyField(through='business.BusinessMember', to='users.User'), ), ]
- 回滚迁移到重命名之前的版本,再重新应用迁移:
# 回滚到0010版本 python manage.py migrate business 0010 # 重新应用修改后的0011迁移和后续的序列修改迁移 python manage.py migrate business
- 验证:执行
python manage.py makemigrations,不会再生成新的重复迁移文件。
方案二:生产环境已上线无需回滚方案
如果迁移已经在生产环境执行过无法回滚,可以直接处理:
- 执行一次
makemigrations生成那个重复的AlterField迁移文件,正常执行migrate应用该迁移 - 之后再执行
makemigrations就不会再生成重复迁移,Django会自动同步迁移历史中的through参数指向。
内容的提问来源于stack exchange,提问作者Karim N Gorjux
相关产品推荐
相关产品推荐

