2013-08-22 1 views
1

나는 이런 식으로 뭔가가 :장고 : 다중 테이블 상속에 자동으로 Downcasting/다형성 테이블

내가 푸 개체가 때마다
class Base(Model): 
    ... 
    def downcast(self): 
     try: 
      return self.childa 
     except: 
      pass 
     try: 
      return self.childb 
     except: 
      pass 
     return self 


class ChildA(Base): 
    .... 

class ChildB(Base): 
    .... 

class Foo(Model): 
    child = ForeignKey(Base) 

이 자식 외래 키 항상 자료의 인스턴스를 - 나의 이해는 장고의 작동 방식 그건입니다 . 지금은 Base에 downcast() 메소드를 추가했습니다 (위 참조). 가능한 파생 형식을 하드 코딩하는 데 신경 쓰지 않습니다.

내가 원하는 것은 어떻게 든 Foo에서 그 다운 캐스트를 자동으로 중앙 집중화하는 것입니다. 이 다중 테이블 상속을 기존 코드에 추가하고 코드에 실제로 다운 캐스팅이 필요한 인스턴스를 계속 찾아서 코드에서 로컬로 수동으로 다운 캐스트해야합니다.

django-polymorphic 패키지를 사용하고 있었지만, 나에게 어떤 부작용이 있는지 알려주지 못했습니다. 어떻게 행을 삭제할 수 없는지/어떻게 처리하고 싶지는 않습니다. opts.pk에 대한 오류가 있습니다. 없음 깊은 queryset 코드.)

그래서 궁금 했어 - __init __() (기본 클래스 init 호출 한 후) 괜찮을거야? 생각하지 못한 부작용이 있습니까? 이것은 처음부터 새로운 인스턴스를 생성 할 때 문제가 될 수있는 것처럼 보입니다.

def __init__(*args, **kwargs): 
    super(Base, self).__init__(*arg, **kwargs) 
    self.child = self.child.downcast() 

아이의 이름을 변경해야합니까?

class Foo(Model): 
    child_poly = ForeignKey(Base) # was child 
    @property 
    def child(self): 
     return self.child_poly.downcast() 

처음부터 Foo()를 만들 때 문제가 될 수 있습니다. 나는 Foo (child = c)라고 말할 수 없다.

더 좋은 방법이 있습니까? django 디버깅을 시도하고 장고 다형성을 제거하면 삭제 문제가 해결 된 것을 발견 한 것이 아니라 일반적인 다형성 솔루션/mixin을 찾고 있지 않습니다.

+1

어떤 장고 다형성 버전을 시도 했습니까? 이 https://github.com/chrisglass/django_polymorphic은 꽤 잘 유지되고있는 것 같습니다. 그것은 내가 당신이 발생한 문제/버그를 게시하는 것이 좋습니다. 네가 벌써했다면 사과 할께. – mtnpaul

+0

다운 캐스팅이 필요한 경우 [InheritanceManager] (https://django-model-utils.readthedocs.org/en/latest/managers.html#inheritancemanager) 양식 django-model-utils를 사용해 볼 수 있습니다. –

+0

django_polymorphic-0.5.tar.gz입니다. 나는 버그를 제기하지 않았다. - 좋아할 것이지만, 장고 쿼리 코드에서 스택 트레이스가 생겼다. 나는 그것을 추적하고 나는 정말로 opts.pk가 opts.pk.name에 액세스 할 때 없음이라는 것을 얻는 것을 제외하고는 무슨 일이 일어나고 있는지에 대한 적절한 설명으로 버그에 대한 정의를 할 수 있다고 생각하지 않았다. – rrauenza

답변

1

결국 장고 다형성으로 돌아가서 내가 전에 가지고 있었던 문제가 없었습니다.