2017-11-21 11 views
1

テーブルと親子関係があります。このように見えます。内部で関数を呼び出す練習

class Person(models.Model): 
    Name = models.CharField() 

class ParentChild(models.Model): 
    child = models.ForeignKey('Person', related_name='child') 
    parent = models.ForeignKey('Person', related_name='parent') 
    validfrom = models.DateTimeField(blank=True, null=True) 
    validto = models.DateTimeField(blank=True, null=True) 

私はツリー全体を照会し、テンプレートに送るjsonを作成しようとしています。 だから私は、それぞれの人のために、子を照会する関数を使用することを考えています。

は、これが私の機能

def getChildren(parentID): 
    try: 
     children = Person.objects.filter(parent=parentID) 

     addJson = 'children: [' 

     for a in children: 
      addJson = addJson + '{text: { name: "Child '+str(a.id)+'" }},' 
      addJson = getChildren(str(a.id)) 

     return addJson 
    except:   
     return addJson 

これは私だけ一人の子供そして何よりを取得しています。だから、私はそれ自身を呼び出すことはできないと思っています。あるいは、関数がもう一度呼び出される前に終了しなければならないかもしれません。

私は今、かなり固執しています。アイデアは大歓迎です!

+1

しかし、実際に、ツリー構造のためにあなたは、はるかに効率的になります[ジャンゴ-MPTT](https://django-mptt.github.io/django-mptt/)のようなものを使用する必要があります。 –

+0

@DanielRoseman私はそれを他の問題で使っていました。しかし、親/子の関係が時間枠に設定されているときは、今できるようには見えません。私はツリーが修正されていればmpttが役に立ちます。私にとっては、賛成が変わり、私は関係の歴史を守る必要があります。 – sumpen

+0

自分自身を呼び出す関数がオフビームでは不可能だと思います。それは間違いなく可能です。ですから、問題はあなたのコードであり、再帰呼び出しを行うことができないとは考えられません。 – BoarGules

答えて

0

私はこの問題を解決しました。私はクエリが間違ったテーブルのPKのためのものであったことに注意を払っていませんでした。

def getChildren(parentID, jsonData): 
    try: 
     qChildren = ParentChild.objects.filter(parent=parentID).values('child') 

     addJson = jsonData + 'children: [' 

     for a in qChildren: 
      addJson = addJson + '{text: { name: "Child ' + str(a['child']) + '" }},' 
      addJson = getChildren(str(a['child']), addJson) 
     addJson = addJson + ']' 
     return addJson 
    except: 
     return None 
関連する問題