Как избежать присвоения, если в поле модели 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)