Django未修改模型却自动生成多余迁移的问题如何解决?
问题原因
这个问题是Django版本差异或者全局主键配置不一致导致的:
- Django 3.1及更早版本的模型默认主键类型为
AutoField(32位自增整数),Django 3.2及之后版本将默认主键类型调整为BigAutoField(64位自增整数)。 - 你首次执行
makemigrations生成0001_initial.py时,运行环境的Django版本≥3.2,或是当时的全局配置指定了默认主键为BigAutoField,所以迁移文件里的主键字段为BigAutoField。 - 后续你的运行环境切换为Django 3.1.7,或是修改了全局主键配置,此时Django判定模型默认主键应为
AutoField,和已存在的迁移文件里的字段类型不一致,就会判定模型发生了变更,生成修改主键类型的0002迁移文件。
解决方法
只要让Django对默认主键类型的判定和首次迁移时的类型保持一致,就可以避免生成多余迁移,推荐优先使用第一种方案:
方案1:显式指定全局默认主键类型
在项目的settings.py文件中添加如下配置,明确指定全局默认主键类型和首次迁移中的类型一致:
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
添加配置后删除已生成的多余的0002迁移文件,再次执行makemigrations就不会再生成额外的迁移。
方案2:为每个模型显式指定主键
如果不想修改全局配置,也可以在每个模型定义中手动声明主键字段,避免Django用默认规则做比对:
class Department(models.Model): id = models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID') name = models.CharField(max_length=255) class Person(models.Model): id = models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID') first_name = models.CharField(max_length=255) last_name = models.CharField(max_length=255) department = models.ForeignKey( Department, related_name="department_members", on_delete=models.CASCADE )
修改模型后删除多余的0002迁移文件即可。
注意:如果你的数据库已经执行过0001_initial迁移,不要随意修改主键类型,避免出现数据类型不兼容的问题,优先选择方案1保持主键类型和首次迁移一致。
内容的提问来源于stack exchange,提问作者Luiz F. Bianchi
相关产品推荐
相关产品推荐

