2013-03-05 2 views
1

유니 코드를 만들려고하는데 상속 테이블에서 필드를 가져 오려고합니다. 이처럼 : 나는 봉투 모델에서 유니 코드를 만드는거야 내가 EnvelopeBase의 모델 인 "self.name"를 얻으려고추상화없이 부모 클래스에서 기본 모델의 필드에 액세스

class EnvelopeBase(models.Model): 
    name = models.CharField(
     max_length=50 
     ) 
    ...........   

class Envelope(EnvelopeBase): 
    category = models.ForeignKey(
     EnvelopeCategory, 
     blank=True, null=True 
     ) 

    ........ 

    def __unicode__(self): 
     return "{0}: {1}".format(self.category, self.name) 

알 수 있습니다. 오류가 발생하지 않았지만 출력이 null입니다. 봉투 모델에 ENvelopeBase 모델의 이름 필드에 액세스하는 방법?

UPDATE :

난 할 노력하고있어 것은 예를 들어 다음과 같은 범주 및 봉투 이름을 표시입니다 :

하자 내가 = 카테고리 = '저축'봉투 '유지 보수'가 있다고

def __unicode__(self): 
    //the self.name here return null 
    return "{0}: {1}".format(self.category, self.name) 

Output: "Savings: maintenance" 

을하지만 내 문제는 ONL입니다 :

출력 (유니 코드 구현에서)해야합니다 y * 저축 (카테고리) *유지 관리 없음 (봉투)입니다. self.name 내가

+0

예기치 않은 결과를 얻기 위해이 모델을 어떻게 사용하는지 간단한 코드 스 니펫을 보여줄 수 있습니까? –

+0

업데이트 해 주셔서 감사합니다. 나는 이런 것을 찾고있다. 'envelope = Envelope (name = 'Sam', category = some_category_instance); envelope.save(); 인쇄 (봉투); print (envelope .__ unicode __())' 현재 모델에서 제공되는 출력은 어떻습니까? –

+0

@ZebDeOs 저장하지 않겠습니다. 나는 그들을 표시하려고하고있다. – catherine

답변

2

django 모델에서 상속을 사용할 때 상위 및 하위 모델에 대해 두 개의 테이블이 만들어집니다. 외부 키 열은 부모 테이블의 해당 행을 참조하는 Parent_ptr_id라는 이름으로 자식 모델에 추가됩니다.

의 우리는 두 가지 모델 (부모와 자녀)이 있다고 가정 해 봅시다 : 당신은 하위 모델의 인스턴스를 만들 때

class Parent(models.Model): 
    parent_field = models.CharField(max_length=50) 
    def __unicode__(self): 
     return self.parent_field 

class Child(Parent): 
    child_field = models.CharField(max_length=50) 
    def __unicode__(self): 
     return self.parent_field + ': ' + self.child_field 

당신이 너무 parent_field를 지정해야합니다.

child = Child(child_field='a', parent_field='b') 

parent_field를 지정하지 않으면 삽입 된 새 상위 행에 parent_field가 null로 설정됩니다. 이것은 귀하의 데이터에 일어날 수 있습니다.

또한 하위 모델의 인스턴스를 만들 때 기존 parent_ptr_id를 지정할 수 있습니다.

child = Child(child_field='c', parent_field='d', parent_ptr_id=1) 

이로 인해 기존 상위의 parent_field가 새 값으로 업데이트됩니다. 까다로운 부분은 여기에 parent_field를 지정하지 않으면 이미 존재하는 부모 행의 parent_field가 null로 업데이트된다는 것입니다. 이것은 데이터에도 일어날 수 있습니다.

그 외에도 기존 코드가 작동해야합니다. (self.envelopebase.name은 내가 아는 한 필요하지 않습니다.)

+0

매우 멋지다. 나는 그녀가 추상화를 원하지 않는다는 것을 언급 할 때까지 실제로 이런 유형의 관계에 대해 몰랐다. 명확히 해 주셔서 감사합니다. – Ngenator

+0

건배, 도움이되기를 바랍니다. – jurgenreza

1

당신은 당신의 기본 모델 추상적 인 https://docs.djangoproject.com/en/dev/topics/db/models/#abstract-base-classes

class EnvelopeBase(models.Model): 
    name = models.CharField(
     max_length=50 
    ) 

    ........... 

    class Meta: 
     abstract = True 


class Envelope(EnvelopeBase): 
    category = models.ForeignKey(
     EnvelopeCategory, 
     blank=True, null=True 
    ) 

    ........ 

    def __unicode__(self): 
     return "{0}: {1}".format(self.category, self.name) 

다른 방법을 만들고 싶어 모델 봉투에 접속을 시도하고있다 EnvelopeBase 모델에서 것은 멀티 포트 테이블 상속입니다 https://docs.djangoproject.com/en/dev/topics/db/models/#multi-table-inheritance

기본적으로 아무 것도 할 필요가 없습니다. Django는 자동으로 둘 사이의 일대일 관계를 만듭니다. 기본 클래스의 모든 필드는 상위 클래스에서 사용할 수 있지만 데이터는 다른 테이블에 존재합니다.

class EnvelopeBase(models.Model): 
    name = models.CharField(
     max_length=50 
    ) 

    ........... 


class Envelope(EnvelopeBase): 
    category = models.ForeignKey(
     EnvelopeCategory, 
     blank=True, null=True 
    ) 

    ........ 

    def __unicode__(self): 
     return "{0}: {1}".format(self.category, self.envelopebase.name) 
+0

네, 고맙지 만 추상을 사용하지 마십시오. 그 EnvelopeBase 모델도 데이터베이스의 데이터를 처리합니다 – catherine

+0

난 정말이 문제에 갇혀있어 ... – catherine

+0

나는 당신이 모델 상속을 잘못 사용하고 있다고 생각합니다. – Ngenator

관련 문제