Как пересчитать поле в другой модели на основе вычислений одной модели в Django?

В моем проекте есть три модели, а именно:

Теперь я хочу, чтобы, когда patient платит сумму и возникает дефицит, я хочу, чтобы эта сумма дефицита сохранялась в expected_value в Receivables, чтобы, когда мы истребуем сумму, дальнейшие расчеты были основаны на этой expected_value, когда мы получим сумму дефицита.

Я пытался использовать сигнал для этой цели:

@receiver(post_save, sender=Realization)
def new_receivable_save(sender, instance, created, **kwargs):
    pkg=Package.objects.get(patient=instance.patient)
    rec=Receivables.objects.get(patient=instance.patient)
    if created:
        if pkg.patient_type!='CASH':
            if instance.deficit_or_surplus_amount<0:
                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=instance.deficit_or_surplus_amount).save()

Эта функция действительно создает новый экземпляр Receivables, но с предыдущим expected_value, а не пересчитанным

Где я ошибаюсь? Как мне следует поступить? Заранее спасибо.

Вы каждый раз правильно сохраняете сумму deficit.

Но вы не сохраняете/обновляете expected_value вообще.

В первый раз вы сохраняете expected_value из base_value, что правильно.

В следующий раз полученную сумму необходимо обновить expected_value (Должно быть 5000, 2500).

  • 75000 base_value, 75000 expected_value.
  • 70000 amount_received - 5000 deficit - 5000 expected_value.
  • 2500 amount_received - 2500 deficit - 2500 expected_value.
  • 1300 amount_received - 1200 deficit - 1200 expected_value.

Здесь вы делаете amount_received - предыдущий expected_value (70000 - 75000 = -5000). Вы делаете отрицательный/обратный результат. Это нормально.

Но Receivables модель имеет save(), которая содержит calculate_expected_value

    def calculate_expected_value(self):
        if (self.package):
            if self.base_value<self.approved_package:
                self.expected_value=self.base_value
            else:
                self.expected_value=self.approved_package
        else:
            self.expected_value=0

Этот метод переопределяет expected_value в этой модели. Он не принимает передаваемое ожидаемое значение при инициализации объекта Receivables(....).save().

Вот здесь вы можете ошибиться. Пожалуйста, поправьте меня, если я ошибаюсь.

Вернуться на верх