ManyToMany继承模型与其父模型之间的关系

时间:2011-05-11 13:57:32

标签: django django-models

可能最容易用一个例子来解释:

class Item(models.Model):
    # ...

class ComplexItem(Item):
    components = models.ManyToManyField(Item, through='ComponentItem', symmetrical=False, related_name='component_of')

class ComponentItem(models.Model):
    # ...
    item = models.ForeignKey(ComplexItem)
    component = models.ForeignKey(Item, related_name='used_in_items

我想要一个包含名称,价格等的项目表。然后我想定义ComplexItems,它们本身就是项目,但它们需要不同数量的其他项目。

以上原因导致管理员应用中出现以下异常:

<class 'inventory.models.ComponentItem'> has more than 1 ForeignKey to <class 'inventory.models.ComplexItem'>

我需要覆盖ComplexItem中的实例方法,并且通常从Item中分离行为,并且继承从纯数据视图中有意义。

这种关系有其他替代定义吗?我还想避免在ComponentItem.component和ComplexItem.components上都需要'related_name'。

2 个答案:

答案 0 :(得分:0)

你需要回到绘图板。虽然从技术上来说可能可能使模型继承并同时由另一个模型组成,但它会变得很快。

尝试让ComplexItem继承自models.Model之类的Item。打赌你,改变一切就能解决所有问题。

答案 1 :(得分:0)

上面的模型实际上工作正常(我想,我目前还没有测试并决定反对它)。但是,为ComplexItem生成的表只有一列指向Item,这是相当无用的。

通过ComponentItem定义从Item到'self'的ManyToMany关系,仍然可以获得ComponentItem的功能。

定义单独的行为就像创建Proxy model一样简单。

上面的实际错误来自我的admin.Inline无法选择正确的外键用于ComponentItem,可以解决like this

我可能会回到上面的继承,但现在这样做。