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

Django中IntegerField设置default=0不生效,求和报NoneType错误如何解决?

报错根源

即便你为IntegerField设置了default=0,但字段保留了null=True属性,当用户提交对应物品数值为空时,Django会将字段值设为None而非默认的0,此时对None执行int()转换或者加法运算都会触发「int和NoneType不支持相加」的类型错误。

修复方案

方案1(推荐:从字段层面根除问题)

如果业务不需要区分「用户未填写」和「用户填写了0」,直接移除所有item字段的null=True属性,仅保留blank=True允许前端不填,Django会自动用默认值0填充未提交的字段,从根源上避免None出现。
调整后的完整代码如下:

class Info(models.Model):
    item_1_amount = models.IntegerField(default=0, blank=True, verbose_name='Item 1 Amount')
    item_2_amount = models.IntegerField(default=0, blank=True, verbose_name='Item 2 Amount')
    item_3_amount = models.IntegerField(default=0, blank=True, verbose_name='Item 3 Amount')
    item_4_amount = models.IntegerField(default=0, blank=True, verbose_name='Item 4 Amount')
    item_5_amount = models.IntegerField(default=0, blank=True, verbose_name='Item 5 Amount')
    total_assets = models.IntegerField(null=True, blank=True, verbose_name='Total Assets')

    @property
    def get_total_assets(self):
        # 遍历所有item字段求和,后续新增item字段只需更新下方列表即可,不用修改加法逻辑
        item_fields = [self.item_1_amount, self.item_2_amount, self.item_3_amount, self.item_4_amount, self.item_5_amount]
        return sum(item_fields)

    def save(self, *args, **kwargs):
        self.total_assets = self.get_total_assets
        super(Info, self).save(*args, **kwargs)

方案2(兼容需保留null的场景)

如果业务需要区分「用户未填写」和「用户填写了0」,必须保留null=True,可以在求和逻辑中对None做兜底替换,无需修改字段定义:

@property
def get_total_assets(self):
    item_fields = [self.item_1_amount, self.item_2_amount, self.item_3_amount, self.item_4_amount, self.item_5_amount]
    # 空值自动替换为0再求和
    return sum(field if field is not None else 0 for field in item_fields)
注意事项

如果选择修改字段定义,调整后需要依次执行以下命令同步数据库结构,否则存量的NULL值仍会触发报错:

python manage.py makemigrations
python manage.py migrate

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 09:54:02