1

나는 두 개의 클래스를 가지고 있는데, 하나는 수퍼 클래스 다. 본질적으로 두 클래스는 트리의 구체적인 클래스입니다. 하나는 잎이고, 하나는 가지입니다. 수퍼 클래스에 정의 된 속성을 공유합니다.자기 참조 외래 키가있는 django의 서브 클래스/프록시를 올바르게 사용합니까?

아래 클래스 중 어느 것도 완료되지 않았습니다. 나는 수퍼 클래스 추상과 서브 클래스 프록시를 만들려고 노력했다. 다행히도 아래 코드는 제가 성취하고자하는 것을 설명합니다.

이는 '잎'

class User(Owner): 
    pass 

이것은 '지점'이다 인 '슈퍼 클래스'

class Owner(models.Model): 
    name = models.CharField(max_length=200) 
    def __unicode__(self): 
     return self.name 
    class Meta: 
     abstract=True 

입니다.

class Group(Owner): 
    head = models.ForeignKey(User) 
    members = models.ManyToManyField(Owner,through='Membership') 

사용자가 회원별로 그룹에 속할 수있는 방법을 보여줍니다.

class Membership(models.Model): 
    date_joined = models.DateField() 
    user = models.ForeignKey(Owner) 
    group = models.ForeignKey(Group) 

제한 내 각 사용자가 많은 그룹 (링커 Membership 통해) 속할 수있다. 각 그룹은 단일 그룹의 구성원이 될 수 있습니다.

사용자로, 그리고 그룹 구성원 모두에서 소유자를 참조하기 때문에 실패합니다. 자바에서 제네릭으로 해결할 수있는 일종의 것 같지만 여기서 도움이되지는 않을 것입니다.

에 대해 사용 된 것으로 보았지만 너무 복잡해 보입니다. 내가 잘못? 필자는 그러한 패러다임을 어떻게 적용 할지를 알 수 없다. 나는 또한 this 질문을 찾았지만 여전히 구현되어야하는 방법에 대해 확신하지 못했습니다.

+0

또한이 질문은 27,000,000입니다. 무언가 승리합니까? – Pureferret

+0

제가 할 수있는 최선은 upvote입니다. – dgel

답변

1

외래 키 필드가 추상 클래스를 가리킬 수 없습니다 (추상 클래스의 경우 DB에 테이블이 없음).

Group이 0 또는 하나의 그룹에 속하도록 자체 참조 외래 키를 구현해야 할 수도 있습니다. 이런 식으로 뭔가 :

class Base(models.Model): 
    name = models.CharField(max_length=200) 
    def __unicode__(self): 
     return self.name 
    class Meta: 
     abstract=True 


class User(Base): 
    groups = models.ManyToManyField('Group', through='Membership', related_name='members') 


class Group(Base): 
    head = models.ForeignKey(User) 
    parent = models.ForeignKey('self', blank=True, null=True, related_name='children') 

    def descendants(self, **kwargs): 
     qs = self.children_set.filter(**kwargs) 
     for group in self.children_set.all(): 
      qs = qs | group.descendants(**kwargs) 
     return qs 


class Membership(models.Model): 
    date_joined = models.DateField() 
    user = models.ForeignKey(User) 
    group = models.ForeignKey(Group) 

Base 클래스는 위의 각 상속 클래스는 각각의 DB 테이블 name 필드와 더 __unicode__ 방법 - 아무것도 가지고 지시 이외의 아무것도하지 않는다. name 필드와 __unicode__ 방법을 복사하여 UserGroup에 복사하면 기능적으로 동일합니다. 일반적인 추상 부모를 갖는 것은 DB 관계를 만들지 않으며 DB를 쿼리하는 데 사용할 수 없습니다.

이 경우 프록시 클래스를 사용할 이유가 없습니다.

+0

프록시는 펼치지 않는 아이디어였습니다. 원래 나는 같은 테이블에서 그 때 원했다. 육체를 도와 주셔서 감사합니다. – Pureferret