Django:项目可扩展折扣计算

时间:2016-07-24 14:02:12

标签: python django oop e-commerce

我正在谈论电子商店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()方法,以考虑品牌在最终产品价格计算中的折扣。

问题:实施最终产品折扣方法的最佳方法是什么,不违反开放原则?

1 个答案:

答案 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())