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

