2011-05-11 123 views
0

可能比较容易用一个例子来解释:多对多关系

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实例方法和一般单独从项目的行为和继承是有道理的,从纯数据视图。

这种关系是否存在一些备选定义?我也想避免在ComponentItem.component和ComplexItem.components上需要'related_name'。

+1

你为什么试图创建基础和继承模型之间的关系?也许一些背景信息会很好:你想做什么?您是否已考虑将基本模型定义为抽象(http://docs.djangoproject.com/zh/dev/topics/db/models/#abstract-base-classes),以便不创建额外的表格? “在几乎所有情况下,抽象继承都是一个长期的更好的方法。” (http://jacobian.org/writing/concrete-inheritance/) – arie 2011-05-11 14:20:40

+0

@arie增加了一些背景信息 - 希望它有帮助。这种关系可以通过递归ManyToMany来实现,但我想区分复杂和非复杂项目的行为。 – Cogsy 2011-05-11 15:16:51

回答

0

您需要回到绘图板。虽然它可能在技术上模型既可以从另一个模型继承,也可以同时由另一个模型组成,但它很快就会变得粘滞。

尝试制作ComplexItem只是从models.Model继承像Item那样。打赌你一个人改变就能解决一切。

0

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

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

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

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

我可能会回到上面的继承,但现在工作。