Django模型migrate迁移出现ValueError:Field 'id'期望数值却得到'default'
报错根因
你遇到的错误是新增owner外键字段时默认值类型不匹配导致的:owner是关联User表的外键,对应User表的主键id为整数类型,但你生成迁移时手动输入了字符串'default'作为默认值,数据库执行字段新增操作时尝试把字符串转整数失败,触发报错。
你回滚到迁移版本0后仍然生成0002迁移,是因为你没有删除app下已生成的历史迁移文件,Django会基于已存在的0001迁移文件(不含owner字段)生成新增字段的0002迁移。
解决步骤
清理无效迁移文件
进入manage_remittance应用的migrations目录,删除除__init__.py之外的所有编号开头的迁移文件(如0001_initial.py、0002_remittance_owner.py)。如果数据库中已有表,可直接删除remittance表,同时清理django_migrations表中所有app字段为manage_remittance的记录。重新生成迁移,根据你的业务场景选对应方案:
- 方案1:开发阶段无有效数据,直接生成包含完整字段的初始迁移
直接执行python manage.py makemigrations manage_remittance,此时生成的0001_initial迁移会直接包含owner和remittance_text两个字段,不需要额外设置默认值,再执行python manage.py migrate即可完成迁移。 - 方案2:表内存在历史数据,允许临时为空
修改models.py中owner字段定义,增加null=True, blank=True:
owner = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True)
执行迁移命令后手动补全所有历史数据的owner字段值,再去掉null=True, blank=True重新生成一次迁移即可。
- 方案3:表内存在历史数据,不允许为空
可指定一个现有合法用户ID作为默认值,比如系统中ID为1的超级管理员:
owner = models.ForeignKey(User, on_delete=models.CASCADE, default=1)
执行迁移后再去掉default=1配置重新生成一次迁移即可。
内容的提问来源于stack exchange,提问作者Raits
相关产品推荐
相关产品推荐

