Как я могу вычислить поля скидки из полей другой таблицы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)

Выход

Вам необходимо заполнить только эти поля

enter image description here

enter image description here

NOTE: здесь я изменил два поля для добавления данных в базу данных

book = models.CharField(max_length=100)
invoice = models.PositiveIntegerField()
Вернуться на верх