2016-04-09 6 views
0

と私は定義されているモデルがあります:Django:動的再帰関係のすべてのインスタンスを取得する方法は?

Model A: 
    parent = ForeignKey('self') 

Model B: 
    a = ForeignKey(A) 

は私がAの1を持っている場合は、どのように私は、すべて取得することができますA.

A1 
|->A2 
    |->A4->B1s 
    |->A5->B2s 
|->A3->B3s 
... 

の不定レベルで定義されたいくつかのデータを持っていると仮定それに関するBs。

たとえば、B1とB2を取得するには、A2を指定します。

A1からB1、B2、B3を取得する方法。

答えて

1

"Tree"と呼ばれるデータ構造 Djangoには、django mpttdjango treebeardの実装がほとんどありません。 A2与えB1SとB2Sを取得する方法を

  • :正確なあなたの質問に答えるために

    。 > A1からB1S、B2S、B3Sを取得する方法をB.objects.filter(Q(a__a=a2))

  • ...>B.objects.filter(Q(a__a__a=a1) | Q(a__a=a1))

あなたも再帰を使用してモデルに簡単な(愚かな)メソッドを追加することができます。

def get_all_children(self): 
    result = [] 
    for child in B.objects.filter(a=self): 
     result.append(child.get_all_children()) 
    return result 

Django ormはボックスからの再帰的なクエリを持っていないので、django mpt tまたはツリービード。

+0

mpttとtreebeardのいずれかが良いと思います。私は彼らがどちらも素晴らしいと思う。 – dspjm

+0

treebeardのように見えるdump_bulkはとてもクールです。一方、それらの両方は、すべての葉を得る方法を持っていませんが、それはあまり良くありません。だから、すべてのノードをクエリしてすべてのBsを取得する必要がありますか? – dspjm

関連する問題