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

如何在Django Models中对两列求和并赋值给另一列

问题解决思路

核心问题

你写的addTotalBal、addTallyCardBal、addTotalPrice这几个自定义方法并未被触发,因为Stock.objects.create()不会自动调用这些方法;另外IntegerField的默认值用了字符串'0',会导致类型转换错误,且计算逻辑的执行顺序没有保障。

修正步骤

1. 修复模型字段的默认值

把IntegerField的default='0'改成整数0,避免类型错误:

class Stock(models.Model):
    # 其他字段保持不变
    balance_bd = models.IntegerField(default=0, null=True)
    received = models.IntegerField(default=0, null=True)
    issued = models.IntegerField(default=0, null=True)
    # 剩余字段定义保持原样

2. 重写模型save方法,整合计算逻辑

将所有计算逻辑整合到save方法中,确保创建或更新对象时自动按顺序执行计算:

class Stock(models.Model):
    # 字段定义部分使用修改默认值后的代码

    def save(self, *args, **kwargs):
        # 处理null值,避免None与整数运算报错
        bal_bd = self.balance_bd or 0
        recv = self.received or 0
        self.total_bal = bal_bd + recv

        total_bal = self.total_bal or 0
        iss = self.issued or 0
        self.tally_card_bal = total_bal - iss

        tally_bal = self.tally_card_bal or 0
        price = self.unit_price or 0
        self.total_price = tally_bal * price

        # 调用父类save方法完成数据保存
        super().save(*args, **kwargs)

    def __str__(self):
        return self.item_name

3. 优化视图代码,使用表单规范保存

视图中改用form.save()替代手动create,确保触发模型的save方法:

def addItem(request):
    if request.method == 'POST':
        form = AddItemForm(request.POST)
        if form.is_valid():
            form.save()  # 自动调用Stock的save方法执行计算
            return redirect('stock')
    else:
        form = AddItemForm()

    context={
        'title':'Add Item',
        'form':form,
    }
    return render(request, 'base/add-item.html', context)

额外优化方案(可选)

如果这些计算字段仅用于展示,不需要持久化到数据库,可以用property属性替代数据库字段,避免数据不一致问题:

class Stock(models.Model):
    # 移除total_bal、tally_card_bal、total_price这三个数据库字段

    @property
    def total_bal(self):
        return (self.balance_bd or 0) + (self.received or 0)

    @property
    def tally_card_bal(self):
        return self.total_bal - (self.issued or 0)

    @property
    def total_price(self):
        return self.tally_card_bal * (self.unit_price or 0)

    # 其他字段和save方法保持原样(无需计算保存逻辑)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 13:20:32