使用mptt的Django模型继承

时间:2012-10-22 19:05:50

标签: django models mptt

我正在使用嵌套树分类来构建模型。词汇Entity继承自抽象基类TreeVocabulary。还有一个类SpecialEntity,它继承自Entity。在SpecialEntity中,应该没有其他字段。

EntitySpecialEntity都应该是树,我使用mpt 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中的错误吗?或者这可能是一个糟糕的设计? 我不是要求为我设计它,而是指向正确的方向

提前致谢!

1 个答案:

答案 0 :(得分:1)

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

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

考虑到修改预订树遍历的原则,这是合理的。

对于db中我的问题中的示例,将创建:

  • specialpe(普通餐桌)

  • entity - 包含mptt字段的树结构,包含数据 两个模型Entity和SpecialEntity

  • specialentity - 包含实体外键的普通表 仅限特殊于SpecialEntity的字段