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
相关产品推荐
相关产品推荐

