django related_name用于字段冲突

时间:2011-01-11 14:39:36

标签: database django orm django-models many-to-many

我的模特中出现了场上冲突:

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')

2 个答案:

答案 0 :(得分:30)

当您拥有ForeignKey时,它会为引用的模型创建一个名为模型名称加_set的属性。这里的问题是两个外键都想在名为User的{​​{1}}上创建一个属性。解决方案是添加每个外键不同的相关名称。

通常,我使用复数作为相关名称。在这些情况下,我在相关名称中添加了“as”子句:

visit_set

您不需要class Visit(models.Model): user = models.ForeignKey(User, related_name="visitsAsUser") visitor = models.ForeignKey(User, related_name="visitsAsVisitor") ,除非每个ManyToManyFieldVisit的用户可以拥有零个或多个访问者。

答案 1 :(得分:9)

如果访问在您的应用程序中是一个强大的概念,那么按照您定义的方式进行操作可能是有意义的:访问包含“用户用户”和“用户访问者” “

但是,如果访问只是用户之间相互关联的一种方式,那么也许你应该在之间建立ManyToMany关系用户。为此,您应该在ManyToManyField.symmetrical中使用User Profile(在其中扩展auth.models.User附带的信息)。

在任何情况下,关于related_name,如果您不从用户访问访问,您可以disable the backwards relation或使用明智的visits_to_self上的uservisits_to_others上的visitor等名称,可以通过调用user.visits_to_self以及user.visits_to_others用户访问过哪些用户来查看用户1}}。