2016-07-24 3 views
0

Я разбираюсь в скелете django e-shop.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

Что вы имеете в виду под «Мне нужно, чтобы расширить свои модели с Brand модели»? Вы хотите добавить внешний ключ к категории, продукту или обоим из модели Brand или модели Brand? Или вы хотите модель подкласса Brand? –

+0

@VladimirDanilov Мне нужно добавить FK от продукта к бренду в этом случае. Также я хочу иметь возможность добавлять те же самые FK от продукта к моделям с собственными скидками. –

ответ

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()) 
Смежные вопросы