django related_name用于字段冲突

The*_*One 18 database django orm many-to-many django-models

我在模特中遇到了一场冲突:

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'.
Run Code Online (Sandbox Code Playgroud)

在访客领域使用什么是明智的'related_field'?此模型基本上表示对特定用户的个人资料发生的访问.

我还应该用ManyToManyField替换任何ForeignKey吗?逻辑有点令人困惑.

编辑:这似乎解决了它,但我不确定这是否是我想要的.:)

 class Visit(models.Model):
      user = models.ForeignKey(User)
      visitor = models.ForeignKey(User, related_name='visitors')
Run Code Online (Sandbox Code Playgroud)

Mik*_*one 30

如果有a ForeignKey,它会创建一个以模型名称加上_set引用模型命名的属性.这里的问题是两个外键都想在Usernamed 上创建一个属性visit_set.解决方案是为每个外键添加不同的相关名称.

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

class Visit(models.Model):
     user = models.ForeignKey(User, related_name="visitsAsUser")
     visitor = models.ForeignKey(User, related_name="visitsAsVisitor")
Run Code Online (Sandbox Code Playgroud)

您不需要a,ManyToManyField除非您每个Visit或每个用户可以拥有零个或多个访问者Visit.

  • 要迂腐,坚持Django的命名惯例可能会更好.所以,`"visitsAsUser"`就像`"visits_as_user"`.我个人更喜欢"user_visits",但这只是个人偏好. (6认同)

Mig*_*ura 9

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

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

在任何情况下,关于related_name,你既可以禁用向后关系,如果你不被访问的访问来自用户,或如使用一个明智的名称visits_to_selfuservisits_to_othersvisitor,这样可以让谁看到通过调用访问用户user.visits_to_self和谁是用户通过访问user.visits_to_others.