Django给已迁移模型新增Id字段后执行makemigrations和migrate报错如何解决
Django自定义Id字段迁移报错解决方案
错误原因
- 首次定义模型未显式指定主键时,Django会自动为模型创建
id自增整数字段作为主键,该字段已存在于数据库表中 - 新增的
Id字段未设置primary_key=True的情况下,会在大小写不敏感的数据库中与默认id字段产生命名冲突;同时非空无默认值的字段添加到已有数据的表时,Django无法为已有行填充字段值,直接触发迁移报错
解决方案
场景1:需要将Id设置为表主键
- 修改模型代码,给
Id字段添加primary_key=True参数,显式声明其为主键,覆盖Django默认生成的主键:
class Social_Network(models.Model): Id = models.TextField(null=False, primary_key=True) Name = models.TextField(null=False) Addresses = models.TextField(null=False)
- 如果是开发环境且无重要业务数据,直接删除对应应用
migrations目录下除__init__.py外的所有迁移文件,删除数据库中Social_Network对应表,重新执行迁移命令即可:
python manage.py makemigrations python manage.py migrate
- 如果已有重要数据不可删除,需分两步迁移:
- 先给
Id字段设置临时默认值(可填充原有id字段的值),执行首次迁移完成字段填充 - 再修改字段配置
primary_key=True,删除原有默认id字段,执行第二次迁移
- 先给
场景2:Id为普通业务字段,不做主键
修改字段名避免与默认主键id重名,同时给非空字段设置合理默认值即可:
class Social_Network(models.Model): # 修改字段名避免冲突,设置默认值 social_id = models.TextField(null=False, default="") Name = models.TextField(null=False) Addresses = models.TextField(null=False)
修改完成后重新执行迁移命令即可正常执行。
内容的提问来源于stack exchange,提问作者Farhad Dorod
相关产品推荐
相关产品推荐

