我正在谈论电子商店django骨架。
# models.py
class Category(models.Model):
name = models.CharField()
discount = models.DecimalField()
class Product(models.Model):
name = models.CharField()
price = models.DecimalField()
category = models.ForeignKey(Category)
discount = models.DecimalField()
现在我需要计算产品最终折扣。它是产品和类别折扣中最大的一个:
class Product(models.Model):
...
def get_final_discount(self):
return max([self.discount, self.category.discount])
但现在我需要用Brand模型扩展我的模型。品牌模型有自己的折扣,所以我需要修改Product.get_final_discount()方法,以考虑品牌在最终产品价格计算中的折扣。
问题:实施最终产品折扣方法的最佳方法是什么,不违反开放原则?
答案 0 :(得分:0)
您可以创建一个方法来检查所有模型的字段以查找2个条件:1。)该字段是ForeignKey
并且2.)它引用的模型具有discount
属性。如果两者都为真,则该方法将reference_model.discount
的值添加到折扣数组中。然后,可以在max()
函数中使用此方法。
这是一个有效的例子:
from django.db import models
class Category(models.Model):
name = models.CharField(max_length=255)
discount = models.DecimalField(decimal_places=2, max_digits=10)
class Brand(models.Model):
name = models.CharField(max_length=255)
discount = models.DecimalField(decimal_places=2, max_digits=10)
class Product(models.Model):
name = models.CharField(max_length=255)
price = models.DecimalField(decimal_places=2, max_digits=10)
category = models.ForeignKey(Category)
brand = models.ForeignKey(Brand)
discount = models.DecimalField(decimal_places=2, max_digits=10)
def get_all_discounts(self):
all_fields = self._meta.get_fields()
discounts = []
for field in all_fields:
if field.get_internal_type() == 'ForeignKey':
field_ref = getattr(self, field.name)
if hasattr(field_ref, 'discount'):
discounts.append(field_ref.discount)
return discounts
def get_final_discount(self):
return max(self.get_all_discounts())