可能最容易用一个例子来解释:
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'。
答案 0 :(得分:0)
你需要回到绘图板。虽然从技术上来说可能可能使模型继承并同时由另一个模型组成,但它会变得很快。
尝试让ComplexItem
继承自models.Model
之类的Item
。打赌你,改变一切就能解决所有问题。
答案 1 :(得分:0)
上面的模型实际上工作正常(我想,我目前还没有测试并决定反对它)。但是,为ComplexItem生成的表只有一列指向Item,这是相当无用的。
通过ComponentItem定义从Item到'self'的ManyToMany关系,仍然可以获得ComponentItem的功能。
定义单独的行为就像创建Proxy model一样简单。
上面的实际错误来自我的admin.Inline无法选择正确的外键用于ComponentItem,可以解决like this。
我可能会回到上面的继承,但现在这样做。