我正在使用嵌套树分类来构建模型。词汇Entity
继承自抽象基类TreeVocabulary
。还有一个类SpecialEntity
,它继承自Entity
。在SpecialEntity
中,应该没有其他字段。
Entity
和SpecialEntity
都应该是树,我使用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中的错误吗?或者这可能是一个糟糕的设计? 我不是要求为我设计它,而是指向正确的方向
提前致谢!
答案 0 :(得分:1)
好的,经过短暂的调查后回答我自己的问题。
可以在mptt中进行多表继承,但任何子项的所有mptt字段(parent,lft,rght,level等)都应该存储在一个(显然是父表)中。
考虑到修改预订树遍历的原则,这是合理的。
对于db中我的问题中的示例,将创建:
specialpe(普通餐桌)
entity - 包含mptt字段的树结构,包含数据 两个模型Entity和SpecialEntity
specialentity - 包含实体外键的普通表 仅限特殊于SpecialEntity的字段