#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. Дорогой, я не могу проголосовать за ваше решение, потому что кнопка «Проголосовать» мне не отображается…