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

Django执行migrate时报Decimal字段值必须为十进制数错误如何处理?

报错原因
  • 代码参数不合法:feedback模型中value字段的max_digits参数传入了浮点数5.,该参数要求必须为正整数,该问题在makemigrations阶段不会触发校验,到migrate阶段执行数据库操作时才会报错。
  • 存量数据格式错误:报错信息直接指向的核心问题是,数据库中对应DecimalField类型的字段(Pharmacy.feed或feedback.value)存在空字符串类型的存量数据。DecimalField仅支持NULL、合法数值格式的字符串/数字,哪怕设置了null=True也无法自动将空字符串''转换为合法值,因此迁移时校验失败。
解决方法
  1. 先修正代码参数错误
    把feedback模型中value字段的定义修正为:
value=models.DecimalField(max_digits=5,decimal_places=0,default=Decimal('1.0'),null=True)

仅需要去掉max_digits参数值里多余的小数点即可。

  1. 处理存量数据格式问题
    根据你的项目情况选择对应方案:
  • 无重要存量数据的新项目:删除对应app下migrations文件夹中除了__init__.py之外的所有迁移文件,删除数据库中对应app的旧表,重新执行python manage.py makemigrations和python manage.py migrate即可。
  • 有不可删除的存量数据:先执行SQL语句将对应字段的空字符串转换为合法值,示例SQL如下(替换为你自己的表名和字段名):
UPDATE 表名 SET 字段名 = NULL WHERE 字段名 = '';

执行完成后再运行python manage.py migrate即可正常迁移。

  • 后续业务需要允许传入空字符串:可以在字段定义中添加blank=True参数,Django 3.2及以上版本还可以添加empty_strings_allowed=True参数,允许字段接收空字符串并自动转换为NULL存储。

内容的提问来源于stack exchange,提问作者mohamed yasser

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 15:27:03