Как избежать присвоения, если в поле модели django задано одно значение?

У меня есть модель товара с 2 внешними ключами к моделям percentDiscount и cashDiscount, я хочу применить только одну из этих скидок к цене единицы товара. Поэтому я определил свойство final_price для получения final_price товара. но я хочу применить одну из этих скидок к товару в данный момент. Есть 2 способа, 1) когда одна из скидок установлена, не позволять устанавливать другую и установить ее как none. 2) сделать что-то в конечной цене, чтобы установить только одну из этих скидок. Ниже приведен мой код, буду рад, если вы поможете мне принять лучшее решение.

class Product(models.Model):
class Meta:
    verbose_name = 'محصول'
    verbose_name_plural = 'محصولات'
    ordering = ('created_at',)
name = models.CharField(max_length=50)
category = models.ForeignKey('product.Category', on_delete=models.CASCADE, related_name='products')
brand = models.ForeignKey('product.Brand', on_delete=models.CASCADE, related_name='products')
# labels such as bestseller, new, not available, etc ...
label = models.CharField(choices=LABEL, max_length=1)
image = models.ImageField(upload_to='product/static/product/images/', null=True, blank=True)
description = models.TextField(max_length=1000, null=True, blank=True)
is_original = models.BooleanField()
inventory = models.PositiveIntegerField(default=0)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True, null=True, blank=True)
unit_price = models.DecimalField(max_digits=8, decimal_places=2)
number_sold = models.PositiveIntegerField()
# discount code for this book
cash_code = models.ForeignKey('cart.CashDiscount', null=True, on_delete=models.CASCADE, blank=True,
                              related_name='related_products')
percentage_code = models.ForeignKey('cart.PercentageDiscount', null=True, on_delete=models.CASCADE,
                                    related_name='related_products', blank=True)
# for food and health products:
expiration_date = models.DateField(null=True, blank=True)
slug = AutoSlugField(populate_from=['name', 'brand'], allow_unicode=True, unique=True)`

@property
def final_price(self):
    if self.get_sale():
        return self.get_sale()
    else:
        return self.unit_price

def get_sale(self):
    if self.cash_code:
        return self.unit_price - self.cash_code.amount
    elif self.percentage_code:
        return self.unit_price - ((self.percentage_code.percentage * self.unit_price) // 100)
    else:
        return None
def save(self, *args, **kwargs):
    if self.cash_code:
        self.percentage_code = None
    elif self.percentage_code:
        self.cash_code = None
    else:
        self.percentage_code = None
        self.cash_code = None
    super(Product, self).save(*args, **kwargs)
Вернуться на верх