2011-03-19 7 views
1

... 자체에 ManyToManyField을 가지고 Soldier깊이 관련 검색

모델.

class Soldier(models.Model): 
    ... 
    subordinates = models.ManyToManyField('Soldier', ...) 

A, BCSoldier 개체

그들이 좋아 "명령의 체인"의 종류를 형성하므로 : A> B> C A.subordinates.all()
CB.subordinates.all()에에

B

0의 모든 부하를 얻는 가장 좋은 방법은 무엇입니까??
A.get_all_subordinates()과 같은 내용으로 [B, C]을 반환해야합니다.

런타임에이 관계의 레벨이 몇 개인지 알 수 없습니다. 다 대다 관계로> 종속 관계, 당신이 graph-하게 될 겁니다 -

답변

2

이 우수한 <을 모델링하는 경우 (CB는 등 형제 자매를 가질 수 있습니다 자신의 일부 부하를 가질 수 있습니다) 임의의 복합체를 얻을 수있는 유사한 구조 (예 : 순환 관계). 이것은 효율적으로 질의하기가 매우 어려울 것입니다. 당신이 (모든 Soldier 우수한 최대 하나의 직접적인을 가지고 있음을 의미)를 트리 구조 후 경우

, 당신은 django-mptt 사용할 수 있습니다

from django.db import models 
from mptt.models import MPTTModel 

class Soldier(MPTTModel): 
    parent = models.ForeignKey('self', null=True, blank=True) 

모든 부하 직원을 얻기 다음

만큼 쉽다
subordinates = soldier.get_descendants() 

get_descendants에 대한 가장 좋은 점은 정확히 하나의 쿼리로 모든 자손을 가져옵니다.

관련 문제