2016-07-24 5 views
0

나는 전자 상점 장고 해골에 대해 얇게보고있다.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]) 

하지만 이제 브랜드 모델로 모델을 확장해야합니다. 브랜드 모델에는 자체 할인이 있으므로 최종 제품 가격 계산에서 브랜드의 할인을 고려하려면 Product.get_final_discount() 메소드를 수정해야합니다.

질문 : 오픈 클로즈 원칙을 위반하지 않는 최종 제품 할인 방법을 구현하는 가장 좋은 방법은 무엇입니까?

+0

당신은 "나는 브랜드 모델로 내 모델을 확장 할 필요"가 무엇을 의미합니까? 브랜드 모델 또는 브랜드 모델에서 카테고리, 제품 또는 둘 다에 외래 키를 추가 하시겠습니까? 아니면 하위 모델 브랜드 모델을 원하십니까? –

+0

@VladimirDanilov이 경우 제품에서 FK를 브랜드에 추가해야합니다. 또한 나는 제품에서 동일한 FK를 자신의 할인 가격으로 모델에 추가 할 수 있습니다. –

답변

0

당신은이 조건에 대한 모델의 모든 필드를 확인하는 방법을 만들 수 있습니다 : 1) 필드가 참조하는 모델은 discount 속성이있는 ForeignKey, 2)이라고합니다. 둘 다 true이면 메서드는 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())