2012-06-05 5 views
2

는 개념적으로 내가 원하는 것은 이것이다 :Django Many to Many 순환 참조?

class Child: 
    guardians = models.ManyToManyField(Guardian) 

class Guardian: 
    children = models.ManyToManyField(Child) 

응용 프로그램은 학교입니다. 모든 부모 (보호자)는 여러 명의 자녀를 가질 수 있으며 모든 자녀는 여러 명의 보호자를 가질 수 있습니다. 자, 나는 C++에서와 같이 파이썬에서 선언을 전달할 수 없습니다.

이 작업을 수행하는 가장 깨끗하고 효과적인 방법은 무엇입니까? 이러한 연결을 나타 내기 위해 세 번째 '관계'클래스가 필요합니까 (이것이 내가 다루는 것입니다)? 그러나 내가 바퀴를 재발견하기 전에 나는 묻고 싶다. 이게 쉬운 것 같아 ...

+2

당신은 절대적으로 양쪽의 관계를 선언 할 필요가 없습니다 here을 설명합니다. 하나만 선택하십시오. –

답변

5

문제를 이해하는 경우 확실하지 않습니다. 이렇게함으로써

:

class Child: 
    guardians = models.ManyToManyField('Guardian', related_name='children') 

class Guardian: 
    .... some other fields 
    # children = models.ManyToManyField(Child) <--- not needed 

는 "아이가 많은 보호자를 가질 수 있고 보호자가 많은 아이를 가질 수 있습니다"라는 같다. 두 모델 모두에서이를 선언 할 필요가 없습니다.

어쨌든 장고 뒤에서 세 번째 (중간) 테이블이 생성됩니다. 이것은 RDBMS에서 ManyToMany 관계를 모델링하는 방법입니다. 당신 이 특정 many2many의 관계를 설명 추가 정보를 넣어야 할 때 명시 적으로는 중간 모델을 만들 싶어

유일한 이유이다. 즉, 당신이 알고 있어야 그 경우

class Child: 
    guardians = models.ManyToManyField('Guardian', 
     through='ChildGuardianMembership', related_name='children') 

class Guardian: 
    .... some other fields 

class ChildGuardianMembership: 
    child = models.ForeignKey(Child) 
    guardian = models.ForeignKey(Guardian) 
    created_at = models.DateTimeField(auto_now_add=True) # When was this relationship established? 

당신이이 보호자와 자녀 사이의 관계를 만들 때 사용하는 모델임을 명시 적으로 중간 모델, 을 선언하기 때문이다.

many2many 관계에 추가 필드를 추가

ChildGuardianMembership.objects.create(child=child_inst, guardian=guardian_inst) 

은 (위와 같이)

+0

감사합니다. 나는 분명히 뭔가 빠져 있다는 느낌이 들었습니다. – MrFox

0

관계가 명시 적으로 비활성화되어 있지 않은 한 관계는 이미 양방향입니다.