2011-04-10 117 views
17

我最近在我的Django模型中遇到了ForeignKey衝突。我需要有兩個外鍵(owner,assigned_to)最終指向相同的模型(用戶)。related_name參數在Django模型中沒有像預期的那樣工作?

從我的理解我需要一個related_name論點來解決這個問題。所以我做了:

assigned_to = models.ForeignKey(TaskUser, blank=True, null=True, related_name='user_assignment') 

owner = models.ForeignKey(TaskUser, related_name="user_ownership" 

但我仍然得到一個錯誤:

tasks.task: Accessor for field 'owner' clashes with related field 'TaskUser.user 
_ownership'. Add a related_name argument to the definition for 'owner'. 
tasks.task: Reverse query name for field 'owner' clashes with related field 'TaskUser.user_ownership'. Add a related_name argument to the definition for 'owner'. 

爲什麼我仍然收到此錯誤?

有一個catch,owner是在超類(BaseWidget)和assigned_to是在一個子類(任務)。在繼承關係中使用related_name有問題嗎?我是否需要重寫所有者的繼承關係,並在子類中重新定義related_name?我會很感激任何幫助!

+0

是否有可能在另一個模型/應用程序中具有相同的字段/類似的相關名稱? – 2011-04-10 11:24:53

+0

我有一個由許多模型繼承的BaseWidget(與所有者)。因此,幾乎所有的模型都會繼承BaseWidget,並因此繼承所有者。 assigned_to僅存在於任務 – 2011-04-10 11:33:37

+1

BaseWidget可能是'abstract'模型嗎? – 2011-04-10 11:46:30

回答

56

提到如果你有一個抽象基類,每類繼承自它都會有這樣的關係ForeignKey關係。因此,您不得對其related_name進行「硬編碼」,因爲所有子類都將嘗試在已實現的類上創建相同的訪問器(在這種情況下爲TaskUser)。

你最好這樣做:

owner = models.ForeignKey(TaskUser, related_name="%(app_label)s_%(class)s_ownership") 

查看此django docs

+0

太好了。純粹的天才。非常感謝你! – 2011-04-11 01:41:21

+0

很好的答案,謝謝! – Vova 2017-08-23 09:03:41

+0

很好的回答!非常感謝。 – Anomitra 2017-09-06 06:52:28

相關問題