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

