【问题标题】:Django model inheritance using mpttDjango模型继承使用mptt
【发布时间】:2012-10-12 15:40:22
【问题描述】:

我正在构建一个具有嵌套树分类的模型。词汇表Entity 继承自抽象基类TreeVocabulary。还有一个类SpecialEntity,继承自Entity。在SpecialEntity 中应该有几个额外的字段。

EntitySpecialEntity 都应该是树,为此我使用 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',)

现在,问题是由于某种原因SpecialEntity 转义 mptt:sqlall 显示一个没有parent_id 的普通表。虽然它存在于Entity,它直接继承自TreeVocabulary

这是 django-mptt 中的错误吗?或者也许这是一个糟糕的设计? 我不是要求为我设计它,而是指出正确的方向

提前致谢!

【问题讨论】:

  • 我看不到你在任何地方继承MPTTModelIt is necessarily
  • 操作,对不起,你说得对,对不起。我已根据我的更改更改了代码,但不幸的是问题仍然存在
  • 是的,你说得对,对不起。我已经更改了问题中的代码,但问题仍未解决:CREATE TABLE "vocabulary_specialentity" ( "entity_ptr_id" integer NOT NULL PRIMARY KEY REFERENCES "vocabulary_entity" ("id") DEFERRABLE INITIALLY DEFERRED, "code" varchar(50) NOT NULL, "type_id" integer NOT NULL REFERENCES "vocabulary_specialtype" ("id") DEFERRABLE INITIALLY DEFERRED )
  • 您迁移表了吗?如果您对代码的更新不仅仅是一个错字修复 - 您应该将您的数据库与代码同步。
  • 是的,我做了 - 没有效果。所以,现在我有继承自 MPTTModel 的 TreeVocabulary、继承自 TreeVocabulary 的实体和继承自实体的 SpecialEntity。在 Entity 中有一个完整的包(parent_id、left、right、level 等),而在 SpecialEntity 中只有 id、code 和 type_id 的外键

标签: django models mptt


【解决方案1】:

好的,经过简短调查后回答我自己的问题。

在 mptt 中可以进行多表继承,但任何子级的所有 mptt 字段(父、lft、rght、级别等)都应存储在一个(显然是父)表中。

考虑到Modified Preorder Tree Traversal的原理,是合理的。

对于我在数据库中的问题中的示例,将创建:

  • 特殊类型(普通表)

  • entity - 具有 mptt 字段的树结构,包含用于 Entity 和 SpecialEntity 两种模型

  • specialentity - 带有实体外键的普通表,包含 仅针对 SpecialEntity 的字段

【讨论】: