Как я могу вычислить поля скидки из полей другой таблицыd
У меня есть такая модель:
class InvoiceItem(models.Model):
book = models.ForeignKey(Book, on_delete=models.PROTECT)
invoice = models.ForeignKey(Invoice, on_delete=models.PROTECT, related_name='items')
title = models.CharField(max_length=100, null=True, blank=True)
price = models.IntegerField(null=True, blank=True)
discount = models.IntegerField(blank=True, default=0)
totalprice = models.IntegerField(null=True, blank=True)
count = models.IntegerField(null=True, blank=True)
И я хочу рассчитать скидку из таблицы скидок книги. Как я могу это сделать? должен ли я рассчитывать ее в моделях?
Если вы хотите вычислять его перед сохранением, или когда он входит в форму админ панели или из любого другого места, вы можете переопределить метод сохранения в модели django
Или вы можете рассчитать, например, из просмотра и вставить его при сохранении
Пример метода сохранения:
class MyModel(models.Model):
...
def save(self, *args, **kwargs):
here you can get field value and insert it in any field you want
Здесь мы можем создать свойство для переопределяемых полей модели следующим образом (без переопределения метода save())
class InvoiceItem(models.Model):
book = models.CharField(max_length=100)
invoice = models.PositiveIntegerField()
title = models.CharField(max_length=100, null=True, blank=True)
og_price = models.IntegerField(null=True, blank=True)
sell_price = models.IntegerField(null=True, blank=True)
discount = models.IntegerField(blank=True, default=0)
discounted_price = models.IntegerField(blank=True, default=0)
count = models.IntegerField(null=True, blank=True)
@property
def discounted_price(self):
return ((self.og_price*self.discount)/100)
@property
def sell_price(self):
return ((self.og_price - self.discounted_price))
с переопределенным методом save()
class InvoiceItem(models.Model):
book = models.CharField(max_length=100)
invoice = models.PositiveIntegerField()
title = models.CharField(max_length=100, null=True, blank=True)
og_price = models.IntegerField(null=True, blank=True)
sell_price = models.IntegerField(null=True, blank=True)
discount = models.IntegerField(blank=True, default=0)
discounted_price = models.IntegerField(blank=True, default=0)
count = models.IntegerField(null=True, blank=True)
@property
def dis_price(self):
print((self.og_price*self.discount)/100)
return ((self.og_price*self.discount)/100)
@property
def selling_price(self):
print(self.og_price - self.dis_price)
return (self.og_price - self.dis_price)
def save(self, *args, **kwargs):
self.sell_price = self.selling_price
self.discounted_price = self.dis_price
super(InvoiceItem, self).save(*args, **kwargs)
Выход
Вам необходимо заполнить только эти поля
NOTE: здесь я изменил два поля для добавления данных в базу данных
book = models.CharField(max_length=100)
invoice = models.PositiveIntegerField()