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

如何修复unsupported operand type(s) for +=: 'NoneType' and 'int'报错

错误产生原因
  • 核心触发点:Investment模型的balance字段没有设置默认值,也没有配置为表单可填写字段,用save(commit=False)生成未入库的模型实例时,investment.balance的值为None,无法和整数类型的investment.amount做累加运算,直接触发类型错误。
  • 额外代码错误:investment.balance.save()是无效调用,balance是整数类型的字段值,不是模型实例,不存在save()方法,就算前面的累加不报错,执行到这行也会抛出属性错误。
  • 逻辑隐患:原代码的累加逻辑没有明确业务边界,如果是新建单笔投资记录,直接在空值上累加不符合业务逻辑;如果是要累计所有投资的总余额,直接在新生成的空实例上做累加完全取不到历史余额值。
修复方法
  1. 先修改模型,给balance字段设置默认值,从根源避免None值出现:
class Investment(models.Model):
    amount = models.PositiveIntegerField()
    # 新增default=0,未手动赋值时字段默认值为0
    balance = models.PositiveIntegerField(default=0)

修改完模型需要执行python manage.py makemigrations和python manage.py migrate同步数据库结构。

  1. 根据实际业务场景修正视图逻辑:
    如果业务需求是每笔新建投资的初始余额等于本次投入的金额,视图代码调整如下:
def create_investment(request):
    if request.method == 'POST':
        invest_form = InvestmentForm(request.POST)
        if invest_form.is_valid():
            investment = invest_form.save(commit=False)
            # 直接给当前投资的余额赋值为本次投资金额
            investment.balance = investment.amount
            investment.save()
            messages.success(request, 'your investment is successfull')
        else:
            # 校验失败时不要用success提示
            messages.error(request, 'your investment is not successfull! Try again.')
    else:
        invest_form = InvestmentForm()
    context = {'invest_form': invest_form}
    return render(request, 'create-investment.html', context)

如果业务需求是每新增一笔投资,就把金额累加到历史总投资余额上,需要先取到最近一笔记录的余额作为累加基数,再计算当前记录的余额:

def create_investment(request):
    if request.method == 'POST':
        invest_form = InvestmentForm(request.POST)
        if invest_form.is_valid():
            investment = invest_form.save(commit=False)
            # 查询最新的历史投资记录,没有记录时基数为0
            last_record = Investment.objects.order_by('-id').first()
            base_balance = last_record.balance if last_record else 0
            investment.balance = base_balance + investment.amount
            investment.save()
            messages.success(request, 'your investment is successfull')
        else:
            messages.error(request, 'your investment is not successfull! Try again.')
    else:
        invest_form = InvestmentForm()
    context = {'invest_form': invest_form}
    return render(request, 'create-investment.html', context)

注意:如果投资和用户是绑定关系,查询历史记录时需要过滤当前登录用户,避免把其他用户的投资余额算进来。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 06:42:30