2010-06-29 1 views
3

나는이 모델을 가지고 :장고 모델은 두 개의 추상 클래스를 가질 수 있습니까?

class BillHeader(models.Model): 
    billno = models.IntegerField(primary_key=True, blank=True) 

class BillData(models.Model): 
    price = models.DecimalField(_('Price'), max_digits=12, decimal_places=2) 
    amount = models.DecimalField(_('Amount'), max_digits=6, decimal_places=2) 

    [... rest of the model ...] 

    class Meta: 
     abstract = True 

class BillFooter(models.Model): 
    total = models.DecimalField(_('Total'), max_digits=12, decimal_places=2) 

    [... rest of the model ...] 

    class Meta: 
     abstract = True 

BillDataBillFooter 모든 BillHeader 그래서 난 abstract로를 표시 한 것이 일반적이다. class BillHeader(BillData, BillFooter)을 할 수 있습니까, 아니면 제가 잘못하고 계시나요?

또한 BillData을 주체로 생각하고 BillHeaderBillFooter 개요를 생각했습니다. 필자는 데이터 모델을 수행하는 데 대한 경험이 없으며 (적어도 복잡한 모델은 아님) 약간 잃어 버렸습니다. 무엇을 추천하나요?

답변

8

예, Django 모델은 모호한 "모델 확인 순서"가 발생하지 않는 한 원하는만큼 많은 추상 기본 클래스에서 상속받을 수 있습니다. 상속을 체인이라고 생각하십시오 ... 상속받은 각 클래스는 체인의 링크입니다. 두 개의 기본 클래스에서 상속하는 것은 하나의 체인 대신 두 개의 링크를 추가하는 것입니다. 당신의 추상 기본 클래스 models.Model에서 상속하는 경우 즉

은 다음 추상 기본 클래스 하고 Bill 클래스models.Model 모두 상속하려고하지 않습니다. models.Model은 이미 상속 체인에 속해 있으므로 상속을 받으면 기본 클래스 체인에 혼란이 발생합니다. I 이러한 클래스를 구성 할 방법에 대한

, 나는 BillHeader, BillDataBillFooter에서 상속 Bill라는 모델을 만들 것입니다. 그 이유는 Django 모델이 개별 객체 (예 : Bill, Article, BlogPost, Photo 등)를 표현하기를 좋아하기 때문입니다. 그러나 추상 추상 클래스의 핵심은 추상화 수준을 추가 할 수 있어야합니다. 공통 필드와 메소드에 연결하여 여러 클래스가 클래스에서 상속받을 수 있도록합니다. Bill 클래스를 만들면 다소 의미가 없습니다. 그러나 Bill, UnpaidBill 및 PaidBill이있는 경우 모두 모두 공통 필드가 나타나며 ABC로 추상화하여 많은 문제를 해결할 수 있습니다.

ABC와 상속이 좋은 것에 대한 약간의 통찰력을 제공하기를 바랍니다.

+0

+1 이산 개체에 대한 설명입니다. 그러나 Bill 클래스를 만들면 여전히 비어있을 수 있습니까? 내 말은, 필드가 없으면 ABC의 것만 상속 받는다는거야? –

+0

사실 수 있습니다. 당신은'pass'를 클래스 아래에 들여 쓰기 만하면됩니다. –