Как пересчитать поле в другой модели на основе вычислений одной модели в 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, 75000expected_value. - 70000
amount_received- 5000deficit- 5000expected_value. - 2500
amount_received- 2500deficit- 2500expected_value. - 1300
amount_received- 1200deficit- 1200expected_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().
Вот здесь вы можете ошибиться. Пожалуйста, поправьте меня, если я ошибаюсь.