2011-09-29 4 views
4

django의 generic relations을 사용하여 상속 모델을 에뮬레이션하려고합니다. 지금까지, 이것은 내가 가지고 올 한 것입니다 :django 일반적인 일대일 릴레이션, 계단식 삭제 포함

당신의 SubClass1 이유 인 Base과 일대일 관계를 가져야한다 (적어도, 희망) 여기에서 무엇을 볼 수에서
class Base(models.Model): 
    content_type = models.ForeignKey(ContentType) 
    object_id = models.PositiveIntegerField() 
    content_object = generic.GenericForeignKey() 
    ... other stuff 

    class Meta: 
    unique_together = ("content_type", "object_id") 

class SubClass1(models.Model): 
    ... properties for this class 

    _base = generic.GenericRelation(Base) 

    @property 
    def base(self): 
    return self._base.all()[0] 

_base 필드를 만들고 나서 base 속성으로 덮는 작업을 모두 마쳤습니다. 그 일반적인 관계를 갖는 것은 자동적으로 필자가 원하는 계단식 삭제를 연결합니다 (그리고 나는 다른 방향에서 삭제를 연결하는 post-delete 신호를가집니다).

Base의 하위 클래스가있을 수 있으며 &과 그 덮음 속성을 붙여 넣으려고 총체적인 느낌이 들게합니다. 나는 또한 이것과 함께 움직이는 커스텀 오브젝트 매니저와 Base의 각 서브 클래스 내에서 모두 똑같이 행동해야만하는 다른 것들을 가지고있다.

일반적인 기능을 캡슐화하는 데 좋은 방법이 있습니까? &을 각 하위 클래스에 붙여 넣을 필요가 없습니다.

답변

2

BaseSubClass이없는 이유는 무엇입니까? 귀하의 예를 기반으로 :

class BaseSubClass(models.Model): 
    _base = generic.GenericRelation(Base) 

    class Meta: 
     abstract = True 

    @property 
    def base(self): 
     return self._base.all()[0] 

class SubClass1(BaseSubClass): 
    # fields 
+0

처음에는 이것을했지만 모델 프레임 워크가 데이터베이스를 구축하는 방식을 좋아하지 않았습니다 ... 그렇다면 내가 받아들이지 않을 이유를 설명하기 위해 예제를 작성하는 동안 당신의 대답은 추상 기본 클래스에 대해 기억하고'meta ='클래스에'abstract = True' 속성을 추가 했으니 완벽 해 보입니다! –

+0

당신 말이 맞아요. 실제로'abstract = True'를 추가하려고했지만 완전히 잊어 버렸습니다. 그에 따라 위의 답변을 업데이트했습니다. –

관련 문제