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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 19:45:03