Django执行migrate迁移报错:id字段期望数字但得到'shafquetnaghmi'
问题根因
你在models.py里移除sender字段错误默认值的修改仅更新了模型层代码,之前给sender设置default='shafquetnaghmi'时Django自动生成的迁移文件没有同步更新——报错里提到的socialapp.0006_remove_instantmessage_sender_instantmessage_sender迁移文件内部,仍然硬编码了这个字符串默认值。迁移执行时会尝试将该字符串作为外键关联的User表ID写入数据库,而外键字段要求存储整数类型的主键ID,因此触发类型不匹配错误。
解决方法
根据迁移文件的同步状态选对应方案即可:
- 方案1:直接修改出错的迁移文件(适合该迁移已经在其他环境执行过、不能随便删除的场景)
- 打开路径
socialapp/migrations/0006_remove_instantmessage_sender_instantmessage_sender.py - 在迁移操作的字段定义部分,找到sender字段配置里的
default='shafquetnaghmi'代码,直接删除这行,或者替换为default=None(匹配你字段配置里null=True的设定) - 保存文件后重新执行
python manage.py migrate即可正常完成迁移。
- 打开路径
- 方案2:删除错误迁移文件重建(适合这个0006迁移还没同步到生产/其他协作成员本地的开发场景)
- 删除
socialapp/migrations/目录下的0006_remove_instantmessage_sender_instantmessage_sender.py文件,同时清理socialapp/migrations/__pycache__目录下对应编号的.pyc缓存文件 - 确认models.py里instantmessage模型的sender字段配置为你需要的最终状态(即你贴出的无default的代码)
- 重新执行
python manage.py makemigrations生成正确的迁移文件 - 执行
python manage.py migrate完成迁移即可。
- 删除
额外排查项
如果上述操作后仍报相同错误,检查两处代码:
- 是否在模型层外给ForeignKey字段配置过返回字符串的全局默认值
- 是否在instantmessage模型的
save()方法、或者任何pre_save信号处理逻辑里,硬编码给sender字段赋值了'shafquetnaghmi'字符串
内容的提问来源于stack exchange,提问作者shafquet Naghmi
相关产品推荐
相关产品推荐

