Django-значение поля по умолчанию зависит от другого значения поля


у меня проблема с установкой значения поля по умолчанию. Что я хочу сделать?
Я хочу, чтобы цена в пакетах классов была значением по умолчанию priceNoTax в счете класса. Как вы можете видеть, все три класса логически связаны.
пример: учетная запись 1 имеет пакет с идентификатором 1. Цена этого пакета-100. Значение по умолчанию priceNoTax для счета 1 равно 100.

Как это сделать? Я относительно новичок в этом, поэтому мне нужно помощь.

models.py

class Packages(models.Model):
     #other fields
     price = models.IntegerField(validators=[MinValueValidator(1)], verbose_name="Price of package")

class Account(models.Model):
     startDate = models.DateField(verbose_name="Start date")
     finishDate = models.DateField(verbose_name="Finish date")
     idPackage = models.ForeignKey(Packages, on_delete=models.CASCADE, verbose_name="Package")

class Bill(models.Model):
     date = models.DateField(default=datetime.now())
     tax = models.FloatField(default=0.20)
     priceNoTax = models.IntegerField()
     priceTax = models.FloatField(default=priceNoTax+(priceNoTax*tax))
     idAccount = models.ForeignKey(Account, on_delete=models.CASCADE, verbose_name="Account")

     def __str__(self):
         return self.date

Спасибо большое!!!

3 ответов


возможно, добавьте это в свой класс Bill?

def save(self, *args, **kwargs):
    if self.priceNoTax is None:
        self.priceNoTax = self.idAccount.idPackage.price
    super(Bill, self).save(*args, **kwargs)

почему вам нужно, чтобы это было поле? Вы видите причину, по которой кто-то хотел бы изменить общую цену без изменения цены и налога на соответствующие значения? Если это действительно не должно быть полем, вы можете просто сделать его методом.

class Bill(models.Model):
     date = models.DateField(default=datetime.now())
     tax = models.FloatField(default=0.20)
     priceNoTax = models.IntegerField()
     idAccount = models.ForeignKey(Account, on_delete=models.CASCADE, verbose_name="Account")

     def priceTax(self):
       return self.priceNoTax + (self.priceNoTax*self.tax)

     def __str__(self):
         return self.date

вы все еще можете использовать его таким же образом в шаблоны с {{ bill.priceTax }}. В коде вам нужно будет использовать bill.priceTax().

таким образом, цена с налогом должна оставаться актуальной независимо от того, как налог или цена без налога изменения.

вы также можете использовать @property декоратор, чтобы избежать необходимости вызывать его как функцию в коде.

@property
def priceTax(self):
   return self.priceNoTax + (self.priceNoTax*self.tax)

подробнее https://docs.djangoproject.com/en/2.0/topics/db/models/#model-methods


@kichik ответил, Как отобразить значение по умолчанию с помощью тега шаблона, и я рекомендую реализовать автоматический расчет javascript.

конечно, вам придется проверить ввод пользователя или реализовать save() метод, как сказал @Chris Curvey.