2011-01-11 128 views
18

我得到一個場交鋒中我的模型:現場Django的related_name擦出

class Visit(models.Model): 
    user = models.ForeignKey(User) 
    visitor = models.ForeignKey(User) 

Error: One or more models did not validate: 
profiles.visit: Accessor for field 'user' clashes with related field 'User.visit_set'. Add a related_name argument to the definition for 'user'. 
profiles.visit: Accessor for field 'visitor' clashes with related field 'User.visit_set'. Add a related_name argument to the definition for 'visitor'. 

這將是一個明智的「RELATED_FIELD」對遊客現場使用?該型號 基本上表示發生在 特定用戶檔案中的訪問。

也應該用ManyToManyField替換任何ForeignKey的?邏輯有點混亂。

編輯: 這似乎解決了它,但我不確定是否它是我想要的。 :)

class Visit(models.Model): 
     user = models.ForeignKey(User) 
     visitor = models.ForeignKey(User, related_name='visitors') 

回答

9

如果訪問是在應用程序中一個強大的概念,那麼它可能是有意義的擁有它,你定義方式:訪問由「用戶用戶」和「用戶訪問者的。

但是,如果一個訪問只是其中用戶涉及他們之間,那麼也許你應該有用戶之間的關係ManyToMany的方式。爲此,您應該在User Profile(其中擴展auth.models.User附帶的信息)中使用ManyToManyField.symmetrical

在任何情況下,對於related_name,您可以將disable the backwards relation,如果你不從用戶訪問訪問,或visitor使用一個明智的名稱,如visits_to_selfuservisits_to_others,這將通過調用user.visits_to_self和用戶訪問user.visits_to_others來查看誰訪問了用戶。

28

當你有一個ForeignKey,它會創建一個具有模型名稱加_set命名爲參考模型屬性。這裏的問題是兩個外鍵都想在User上創建一個名爲visit_set的屬性。解決方案是添加每個外鍵不同的相關名稱。

通常,我使用複數的相關名稱。在這樣的情況下,我增加一個「爲」條款相關的名稱:

class Visit(models.Model): 
    user = models.ForeignKey(User, related_name="visitsAsUser") 
    visitor = models.ForeignKey(User, related_name="visitsAsVisitor") 

你不想ManyToManyField,除非你可以爲每個VisitVisit零層或更多的遊客,或用戶。

+5

要迂腐,遵守Django的命名約定可能會更好。所以,`「visitsAsUser」`就像``visits_as_user'``。我個人更喜歡``user_visits``,但這只是個人偏好。 – Johndt6 2014-08-28 18:39:10