我的模特中出现了场上冲突:
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')
答案 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")
,除非每个ManyToManyField
或Visit
的用户可以拥有零个或多个访问者。
答案 1 :(得分:9)
如果访问在您的应用程序中是一个强大的概念,那么按照您定义的方式进行操作可能是有意义的:访问包含“用户用户”和“用户访问者” “
但是,如果访问只是用户之间相互关联的一种方式,那么也许你应该在之间建立ManyToMany
关系用户。为此,您应该在ManyToManyField.symmetrical中使用User Profile(在其中扩展auth.models.User
附带的信息)。
在任何情况下,关于related_name,如果您不从用户访问访问,您可以disable the backwards relation或使用明智的visits_to_self
上的user
和visits_to_others
上的visitor
等名称,可以通过调用user.visits_to_self
以及user.visits_to_others
用户访问过哪些用户来查看用户1}}。