12

子と親の 2 つのフィールドを持つモデルが必要です。ジャンゴでこれを行うにはどうすればよいですか? 私はこのようなものを持っています

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 を使用することになっているとは思いません (特に、「空白」でキーワード エラーが発生するため)。何かアドバイス?

4

3 に答える 3

24

ManyToOneRelは内部実装クラスであり、モデルで使用するためのものではありません。

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

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

ツリーで複雑なことをしようと計画している場合は、おそらくdjango-mpttライブラリを使用したいと思うでしょう。

于 2013-03-18T21:37:07.637 に答える
3
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 クラスのインスタンスではありません。

于 2013-03-18T21:18:52.910 に答える
0

ドキュメントが見つからなかったので、コードManyToOneRelを調べました:

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

ご覧のとおり、blank引数はありません。

于 2013-03-18T21:13:39.620 に答える