2013-03-15 28 views
0

我創建了一個Django模型,其中兩個ManyToManyField指向同一個字段。在Django的相同字段中指定多個「through」表

在我的例子中,人才和興趣既是「技能」,也有不同的表格。

class Skills(models.Model): 

    def __unicode__(self): 
     return self.name 

    name = models.CharField(max_length=255, unique=True) 
    users = models.ManyToManyField(UserProfile, default=None, 
      through='TalentDetails', related_name='talents') 
    users = models.ManyToManyField(UserProfile, default=None, 
      through='InterestDetails', related_name='interests') 

我在嘗試通過時,其相關的名字

UserProfile.interests.all() #[<Skills: Guitar>] 
UserProfile.talents.all() # AttributeError: 'UserProfile' object has no attribute 'talents' 
# the following works 
UserProfile.talentdetails_set.all() # [<TalentDetails: (u'Architecture',)>] 

訪問人才,使幾個問題的錯誤:

  • 爲什麼第二次查詢失敗?
  • 這是一個在同一領域指定多個「通過」表的猶太教方式,還是有更好的方式來做到這一點?

回答

1

你有兩個同名的模型字段,users,第二個(到InterestDetails)取代第一個,只是給他們不同的名字,它會起作用。

+0

true。但我想避免使用兩個字段(例如user和user_ )來指定相同的關係(用戶)。如果我將關係指定爲不對稱,我可以讓Skill字段在其與UserProfile的關係中使用兩個不同的「通過」表嗎? – 2013-03-15 16:44:20

+0

我認爲我們需要更好地理解你在這裏試圖建模的整體問題,感覺就像你可能試圖以錯誤的方式解決它。 – 2013-03-15 16:47:47

+0

這可能很好。我正在建立一個人才/興趣目錄。才能和興趣都代表了從技能到個人資料的關係。這個關係的細節在[Talent | Skill]細節表中被捕獲。現在,我正在嘗試創建兩個「通過」從技能到配置文件的表來模擬這種關係。我想我可以使用一個帶有旗幟的「通過」表來表明它是否是一個人才/技能,但這不是一個非常優雅的解決方案...... – 2013-03-15 16:52:43

-1

你所要求的確實沒有意義。顯然,一個字段只能有一組選項,並且你試圖擁有兩組選項。但目前還不清楚爲什麼你要這樣做:我明白這兩個領域都連接了相同的兩個表格,但他們對不同的事物進行建模:第一個領域是「擁有這種技能作爲人才的用戶」,另一個領域是「擁有此技能作爲興趣的用戶「。因此,您應該有兩個字段,都指向UserProfile但名稱不同 - 例如users_with_talentusers_with_interest

(請注意,除非您定義關係的額外信息,否則不需要明確定義直通表。)

相關問題