如何解决Django执行migrate时报ValueError: Field 'cid' expected a number but got ''
错误根源
Django的迁移文件是按生成顺序链式执行的,即使你后续修改了模型、生成了新的迁移文件,执行migrate时仍会从最早未执行的历史迁移开始跑。你旧迁移文件0003_auto_20211009_2038中存在非法操作:给数值类型的AutoField字段cid设置了空字符串''作为默认值,类型不匹配导致迁移执行到该步骤时直接抛出错误,根本无法运行到后续你修改主键为email的新迁移,所以即使你现在的模型里已经没有cid字段,还是会报错。
修复方案
根据你当前的环境选择对应方案即可:
开发环境(无重要数据)
- 删除当前app下migrations文件夹内的所有历史迁移文件,仅保留
__init__.py - 清空数据库
django_migrations表中对应当前app的所有迁移记录,也可直接删除开发数据库重建 - 执行
python manage.py makemigrations生成全新的迁移文件,新文件中不会再出现给cid设置空默认值的非法操作 - 执行
python manage.py migrate即可完成迁移
生产/有重要数据的环境
- 定位到报错的旧迁移文件
0003_auto_20211009_2038.py,找到添加cid字段的代码行 - 将该行中的
default=''参数修改为数值类型合法值,比如default=1;如果cid是AutoField主键,本身不需要手动设置默认值,直接删除default参数即可 - 同步检查后续迁移文件中是否存在其他操作cid字段的非法逻辑,如有一并修正
- 重新执行
python manage.py migrate即可正常跑完所有迁移
注意:操作前请先备份全量数据库,避免数据丢失。
内容的提问来源于stack exchange,提问作者Ashwin Behera
相关产品推荐
相关产品推荐

