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

Django新增DecimalField字段迁移报错:值必须为十进制数

解决Django DecimalField迁移时的ValidationError问题

问题分析

错误提示['“” value must be a decimal number.']说明存在空字符串无法转换为Decimal类型的情况。blank=True仅控制表单层面的空值验证,不解决数据库数据转换或默认值类型不匹配的问题。

解决方案

1. 修正默认值类型

DecimalField的默认值必须是decimal.Decimal实例,而非浮点数。修改models.py中的字段定义:

from decimal import Decimal

price = models.DecimalField(
    max_digits=10, decimal_places=2, default=Decimal('0.00'), null=True, blank=True
)

2. 清理数据库中的空字符串数据

如果已有数据中该字段存在空字符串,需先通过数据迁移修复:

  • 生成空迁移文件:
    python manage.py makemigrations --empty your_app_name
    
  • 编辑生成的迁移文件,添加数据修复逻辑(替换your_app_name和YourModel为实际名称):
    from decimal import Decimal
    from django.db import migrations
    
    def fix_empty_price(apps, schema_editor):
        YourModel = apps.get_model('your_app_name', 'YourModel')
        # 将空字符串的price字段更新为0.00,也可改为None(如果允许null)
        YourModel.objects.filter(price='').update(price=Decimal('0.00'))
    
    class Migration(migrations.Migration):
        dependencies = [
            ('your_app_name', '之前的迁移文件名'),  # 替换为你最近的迁移文件名称
        ]
    
        operations = [
            migrations.RunPython(fix_empty_price),
        ]
    
  • 执行数据迁移:
    python manage.py migrate
    

3. 重新执行字段迁移

修正字段定义后,重新生成并执行迁移:

python manage.py makemigrations
python manage.py migrate

关键说明

  • null=True允许数据库存储NULL值,blank=True允许表单提交空值,但两者结合时需确保数据不会出现空字符串这类无法被Decimal解析的值。
  • 使用Decimal('0.00')作为默认值可避免浮点数精度问题导致的转换错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 03:10:04