2009-05-28 85 views
5

我試圖創建兩個通用(content_type)引用之間的映射表,一個用於「代理」,另一個用於「資源」。帶有兩個通用(content_type)外鍵的django模型?

所以我採取一貫的方式,我做一個普通的外鍵:

content_type = models.ForeignKey(ContentType) 
object_id = models.PositiveIntegerField() 
resource = generic.GenericForeignKey('content_type', 'object_id') 

我嘗試做一個模型有兩個。

agent_content_type = models.ForeignKey(ContentType) 
agent_object_id = models.PositiveIntegerField() 
agent = generic.GenericForeignKey('agent_content_type', 'agent_object_id') 

resource_content_type = models.ForeignKey(ContentType) 
resource_object_id = models.PositiveIntegerField() 
resource = generic.GenericForeignKey('resource_content_type', 'resource_object_id') 

但這現在拋出了以下錯誤:

myapp.mymodel:訪問者現場 'resource_content_type' 衝突與 相關領域 'ContentType.mymodel_set'。將 related_name參數添加到 'resource_content_type'的 定義中。

和代理類似。

這是怎麼回事?我該怎麼做?

歡呼

菲爾

回答

10

你試過做什麼錯誤消息告訴你這樣做 - 增加一個related_name說法?

agent_content_type = models.ForeignKey(ContentType, related_name='mymodel_agent') 

編輯: 爲什麼會發生的原因是,每次你定義一個外鍵時,Django會自動給出目標模型的屬性做反向查找。默認情況下,它給出相關表的名稱+ - 因此如果article表的FK爲section,則section將獲得article_set屬性用於反向查找。

現在,如果你在同一個模型指向2個FKS在同一目標模型,Django會嘗試給他們foo_set屬性,從而導致衝突。因此,該錯誤消息告訴您手動設置related_name屬性。

+0

謝謝,這工作。但我希望有人能解釋爲什麼。或者說,爲什麼當我有兩個通用的外鍵而不是一個時出現歧義? – interstar 2009-05-28 11:12:53