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