2013-03-18 18 views
6

2つのフィールド、子供、親を持つモデルが必要です。どのように私はジャンゴでこれを行うのですか?私はdjangoモデルでツリー構造を作る?

from django.db import models 
class FooModel(models.Model) 
    parent = models.ForeignKey('self', blank=True, null=True) 
    children = models.ManyToOneRel('self', blank=True, null=True) 

    def __init__(self, *args, **kwargs): 
     super(FooModel, self).__init__(*args, **kwargs) 
     self.parent.children.add(self) 

このようなものを持っているしかし、私は、私が(それは私に「ブランク」のキーワードにエラーを与えている、特にので)このようManyToOneRelを使用するようになってるとは思いません。何かアドバイス?

+5

https://github.com/django-mptt/django-mptt/ – dm03514

+1

https://tabo.pe/projects/django-treebeard/docs/1.61/api.html – andrefsp

+0

これらは両方とも素晴らしいですが、それは私が上にしようとしているようなフィールドで直接それを行うことは可能ですか?私はむしろこれに別の依存関係を入れないであろうし、この場合はそれほど効率が悪いとは思わない。 – sfendell

答えて

17

ManyToOneRelは、内部実装クラスであり、お使いのモデルでは使用できません。

しかし、なぜあなたはそれがとにかく必要だと思いますか?ドキュメンテーションで詳しく説明しているように、ForeignKeyを定義すると、自動的に逆の関係が得られます。ですから、parentを定義した場合、あなたのケースで、あなたは自動的にすでにself.foomodel_setを取得する:あなたはrelated_nameパラメータ使って、それがさらに明示的に行うことができます:あなたは木が複雑なことをやってを計画している場合は、その

parent = models.ForeignKey('self', blank=True, null=True, related_name='children') 

注意をおそらくdjango-mpttライブラリを使用したいと考えています。

0

私はManyToOneRelのドキュメントを見つけることができませんでしたので、私はcode for itを見上げ:

def __init__(self, to, field_name, related_name=None, limit_choices_to=None, 
     parent_link=False, on_delete=None): 

あなたが見ることができるように、何のblank引数はありません。

+0

そうです、私はすでにそれを理解しました。私は代わりに何を使うべきなのか疑問に思います。 – sfendell

+0

多分、CharFieldを使って子供のキーとカスタムメソッドまたはプロパティをリクエストしてインスタンス化できますか? –

2
class FooModel(models.Model) 
    parent = models.ForeignKey('self', blank=True, null=True, related_name='children') 


FooModel.objects.get(pk=1).children.all() 

あなたが欲しいものは何でも利用をキャッシュしたい場合:どこかの問合せのキャッシングは、PKSのフラットリストとして親のすべての子供たちを保存するが、このリストを更新するために、新しいエンティティを処理することを忘れないでください。 ManyToOneRelは、Djangoの内部ニーズに対応しています。さらに、Fieldクラスのインスタンスではありません。