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

#python #django #django-models #django-views #django-forms

Вопрос:

Информация: Я пытаюсь создать приложение, похожее на ежемесячный взнос. Когда я создаю файл клиента. Цена Property купленного будет автоматически добавлена к Customer оставшемуся балансу. Моя логика приложения-это несколько платежей для одного клиента. Я хочу добавить всю сумму платежей collec_amount , и collect_amount будет вычтен из оставшегося баланса. Если я удалю какой-либо платежный объект у клиента, то остаток средств будет автоматически обновлен перед удалением объекта.

Проблема: Приведенный ниже расчет кода работает неправильно. Расчет создает путаницу, когда я пытаюсь обновить существующий платеж. Если у кого-нибудь есть лучшее решение для сообщенного поста. Я был бы благодарен за любую помощь.

models.py

 class Property(models.Model):
    area = models.CharField(max_length=255)
    price = models.IntegerField(default=0)


class Customer(models.Model):
    name = models.CharField(max_length=255)
    prop_select = models.ForeignKey(Property, on_delete=models.SET_NULL, null=True)
    remaining = models.IntegerField(default=0)
    collect_amount = models.IntegerField(default=0)

    def save(self, *args, **kwargs):
        self.remaining = self.prop_select.price
        self.remaining -= self.collect_amount
        super().save(*args, **kwargs)

class Payment(models.Model):
    customer = models.ForeignKey(Customer, null=True, on_delete=models.SET_NULL, blank=True, related_name='payment')
    amount = models.IntegerField(default=0)
    
    def save(self, *args, **kwargs):
        self.customer.collect_amount  = self.amount
        self.customer.save()
        super(Payment, self).save(*args, **kwargs)

    def delete(self, *args, **kwargs):
        self.customer.collect_amount -= self.amount
        self.customer.save()
        super(Payment, self).delete(*args, **kwargs)
 

Комментарии:

1. о каком «беспорядке» вы говорите? Не могли бы вы быть более конкретными?

2. когда я создаю платеж в размере 1000 из 4000 для клиента. если я попытаюсь отредактировать выходящий платеж, я хочу, чтобы обновлялось только это, в частности, я не хочу никаких изменений в оставшемся балансе. отныне после того, как я завершу обновление, завершив платеж, оставшийся остаток может быть обновлен самостоятельно.

Ответ №1:

 from django.core.validators import MinValueValidator
from django.db.models import Sum


class Property(models.Model):
    area = models.CharField(max_length=255)
    price = models.DecimalField(max_digits=17, decimal_places=2, default=0.0,
                            validators=[MinValueValidator(Decimal('0.00'))])


class Customer(models.Model):
    name = models.CharField(max_length=255)
    prop_select = models.ForeignKey(Property, on_delete=models.SET_NULL, null=True)
    remaining = models.DecimalField(max_digits=17, decimal_places=2, default=0.0,
                        validators=[MinValueValidator(Decimal('0.00'))])
    collect_amount = models.DecimalField(max_digits=17, decimal_places=2, default=0.0,
                        validators=[MinValueValidator(Decimal('0.00'))])

    def get_remaning_amount(self):
        property_price = self.prop_select.price
        payment_done_by_customer = Payment.objects.filter(customer=self).aggregate(Sum('amount'))['amount__sum']
        return property_price - payment_done_by_customer


class Payment(models.Model):
    customer = models.ForeignKey(Customer, null=True, on_delete=models.SET_NULL, blank=True, related_name='payment')
    amount = models.DecimalField(max_digits=17, decimal_places=2, default=0.0,
                        validators=[MinValueValidator(Decimal('0.00'))])
 

Комментарии:

1. дайте мне знать, если вы сможете получить этот код?

2. Дорогой, я не могу проголосовать за ваше решение, потому что кнопка «Проголосовать» мне не отображается…