Django报错:+=运算不支持NoneType与int类型操作数问题排查
报错根因
触发'unsupported operand type(s) for +=: 'NoneType' and 'int'是两个问题叠加导致的:
- 模型中
balance字段配置了null=True,新建未保存的Investment实例没有给balance赋值时,该字段默认值为None,直接对None执行+=加法运算会触发类型不匹配错误。 - 视图中写的
investment.balance.save()是无效代码:balance是整数类型的字段值,并非模型实例,不存在save()方法,这行就算绕过前面的类型错误也会抛出属性异常。
修复步骤
1. 调整模型字段配置
从根源避免None值出现,同时修正创建时间字段的配置错误:
class Investment(models.Model): user = models.ForeignKey( User, on_delete=models.CASCADE, null=True, blank=True) amount = models.IntegerField(null=True) # 给balance设置默认值0,移除null=True,禁止存空值 balance = models.IntegerField(default=0, blank=True) investment_id = models.CharField(max_length=10, null=True, blank=True) plan = models.ForeignKey(Plan, on_delete=models.CASCADE, null=True) active = models.BooleanField(default=True) # 创建时间用auto_now_add,仅首次创建时写入;auto_now适合更新时间字段 created_at = models.DateTimeField(auto_now_add=True, null=True) def __str__(self): return str(self.investment_id)
整数类型字段不建议配置
null=True,空值用默认0即可,否则后续做数值计算时需要频繁判空,很容易出类型错误。
2. 修正视图逻辑
删除无效的balance.save()调用,补充缺失的逻辑:
def create_investment_view(request): if request.method == 'POST': investment_form = InvestmentForm(request.POST) if investment_form.is_valid(): investment = investment_form.save(commit=False) # 加一层防御性判空,兼容历史存在的balance为None的数据 if investment.balance is None: investment.balance = 0 investment.balance += investment.amount # 关联当前登录用户,否则投资记录不会绑定到操作人 investment.user = request.user investment.save() messages.success(request, 'your investment is successfull') else: # 校验失败用error级别消息,原来用success属于逻辑错误 messages.error(request, 'your investment is not successfull! Try again.') else: investment_form = InvestmentForm() context = {'investment_form': investment_form} return render(request, 'create-investment.html', context)
- 修复点1:删除无效的
investment.balance.save()调用,所有字段赋值完成后统一调用实例的save()方法即可。 - 修复点2:补充当前登录用户赋值逻辑,避免
user字段为空。 - 修复点3:表单校验失败的提示修正为错误级别消息,避免误导用户。
内容的提问来源于stack exchange,提问作者Thaddeaus Iorbee
相关产品推荐
相关产品推荐

