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.