2011-03-19 76 views
1

我要尋找一個「Python化」 /「ORM-IC」對於這個問題的解決方案... Soldier有一個ManyToManyField本身深度關係檢索

模型。

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

ABCSoldier對象

它們形成種 「命令的鏈」,例如:A> B> C

BA.subordinates.all()
CB.subordinates.all()

什麼是讓所有下屬A
類似於A.get_all_subordinates(),應該返回[B, C]

我們不知道在運行時有多少關係。 (C可以有自己的一些下屬,B能有兄弟姐妹等)

回答

2

如果建模優越< - >下屬有許多一對多的關係,關係,你會得到一個graph-結束像結構可以得到任意複雜的(例如循環關係)。這將很難有效地查詢。

如果一個樹狀結構(這意味着每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:它只會導致一個查詢得到所有的後代。