2011-05-11 324 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

我可能會回到上面的繼承,但現在工作。