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

Django中如何基于一个模型的计算结果重算另一模型的指定字段

问题原因
  • 核心问题是你手动给新Receivables实例传入的expected_value,会被Receivables自带的save方法里的calculate_expected_value逻辑覆盖:你调用save()的时候,系统自动重新计算了expected_value,完全覆盖了你传入的赤字金额。
  • 额外问题:你提供的calculate_expected_value方法代码存在缩进错误,方法下的逻辑没有正确缩进,运行时会直接报错。
修复方案

1. 调整Receivables的save方法,增加跳过自动计算的参数

修改Receivables的save方法,新增skip_calculate参数,当我们需要手动设置expected_value(比如新建追款应收记录)时,跳过自动计算逻辑,保留我们手动传入的值:

def save(self, *args, skip_calculate=False, **kwargs):
    if not skip_calculate:
        self.calculate_approved_discount()
        self.calculate_base_value()
        self.calculate_expected_value()
    super(Receivables, self).save(*args, **kwargs)

同时先修复calculate_expected_value的缩进问题,确保方法下的逻辑都在方法内。

2. 修改信号逻辑,保存时跳过自动计算

信号里创建新Receivables实例后,保存时传入skip_calculate=True,同时增加空值判断避免异常:

@receiver(post_save, sender=Realization)
def new_receivable_save(sender, instance, created, **kwargs):
    if not created:
        return
    pkg = instance.package
    rec = instance.receivables
    # 边界校验:不存在关联记录/现金患者/无赤字时直接返回
    if not pkg or not rec or pkg.patient_type == 'CASH' or instance.deficit_or_surplus_amount >= 0:
        return
    Receivables(
        patient=rec.patient, 
        rt_number=rec.rt_number, 
        discount=rec.discount, 
        approved_package=rec.approved_package, 
        proposed_fractions=rec.proposed_fractions, 
        done_fractions=rec.done_fractions, 
        base_value=rec.base_value, 
        expected_value=abs(instance.deficit_or_surplus_amount)
    ).save(skip_calculate=True)

修改后新建的Receivables实例的expected_value就会保留你传入的赤字金额,后续Realization计算时,会自动取最新的Receivables记录的expected_value作为计算基准,符合追款场景的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 19:45:03