2014-01-14 17 views
0

鑑於以下模型:Django模型 - 獲得表的關係後裔自

class Item(models.Model): 
    name = models.CharField(max_length = 45) 
    belongsTo = models.ManyToManyField("self", symmetrical=False, related_name='parentOf') 

    def get_descendants(self): 
     "Returns items descendants" 
     pass 

我將如何實現get_descendants函數來獲得類似於以下的n後人的東西:

Item.objects.filter(belongs_to=item).filter(belongs_to__belongs_to=item).filter(...) 
+0

你的意思是獲得整個子樹?或直接後代? –

+0

例如,給定當前項目(自我),返回由孩子和孩子的孩子以及孩子的孩子等組成的集合 – richard008

回答

2

你可能想看看Django-MPTT:http://django-mptt.github.io/django-mptt/overview.html,特別是它的模型方法:http://django-mptt.github.io/django-mptt/models.html#mpttmodel-instance-methods

它提供了一切你需要的操作這樣的關係,我已經在涉及與你類似的模型的幾個項目中使用它,它使用起來非常簡單。

如果您不想使用任何第三方應用程序,那麼返回對象查詢集的循環似乎是解決此問題的一種方法。

+0

如果使用MPTT,我必須返回並重寫已使用當前項目的任何視圖模型? – richard008

+1

據我瞭解你的問題,你還沒有使用任何有關物品後代的自定義方法。使用MPTT只會迫使你改變相關字段(如果你遵循Python準則,屬於-btw它應該屬於belongs_to)。因此,我可以認爲你的視圖沒有必要的改變,但是你的數據庫將不得不改變(使用南或其他方法)。 – Ambroise