2011-01-11 130 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