2

ネストされたツリー分類を使用してモデルを構築しています。ボキャブラリEntityは抽象基本クラスから継承されTreeVocabularyます。SpecialEntityから継承するクラスもありEntityます。には、いくつSpecialEntityかの追加フィールドがあるはずです。

Entityどちらもツリーである必要がありSpecialEntity、そのために mptt http://django-mptt.github.com/django-mptt/を使用します。にEntity子を持つレコードがあるはずですSpecialEntity(これらの子は のルート要素ですSpecialEntity)。

これは私がこれを想像する方法です:

class Vocabulary(models.Model):
    name= models.CharField(max_length=300)
    order= models.IntegerField(default=100)
    class Meta:
        abstract= True

class SpecialType(Vocabulary):

class TreeVocabulary(MPTTModel):
    parent= TreeForeignKey('self', null=True, blank=True,
        related_name='children', limit_choices_to=Q(parent__isnull=True))
    class MPTTMeta:
        order_insertion_by= ('name',)
    class Meta:
        abstract= True

class Entity(TreeVocabulary):

class SpecialEntity(Entity):
    code= models.CharField(max_length=50)
    type= models.ForeignKey(SpecialType)
    class Meta:
        ordering= ('code',)

さて、問題は、何らかの理由でSpecialEntitymptt をエスケープすることです: 含まれていsqlallないプレーンなテーブルを表示parent_idします。に存在しますがEntity、 から直接継承しTreeVocabularyます。

django-mptt のバグですか? それともデザインが悪いのでしょうか?私は私のためにそれを設計するように頼んでいるのではなく、正しい方向に向けることを求めています

前もって感謝します!

4

1 に答える 1

1

わかりました、短い調査の後、私自身の質問に答えます。

mptt では複数テーブルの継承が可能ですが、子のすべての mptt フィールド (parent、lft、rght、level など) は 1 つの (明らかに親) テーブルに格納する必要があります。

Modified Preorder Tree Traversal の原則を考慮すると、妥当です。

データベースでの私の質問の例では、次のものが作成されます。

  • 特殊タイプ(プレーンテーブル)

  • entity - モデル Entity と SpecialEntity の両方のデータを含む、mptt フィールドを持つツリー構造

  • specialentity - SpecialEntity に固有のフィールドのみを含む、エンティティへの外部キーを持つプレーン テーブル

于 2012-10-23T13:43:42.423 に答える