【问题标题】:django related_name for field clashes字段冲突的 djangorelated_name
【发布时间】:2011-06-07 05:20:18
【问题描述】:

我的模型中出现了场冲突:

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

【问题讨论】:

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


    【解决方案1】:

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

    通常,我使用复数来表示相关名称。在这种情况下,我会在相关名称中添加一个“as”子句:

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

    您不想要ManyToManyField,除非每个Visit 可以有零个或多个访问者,或者每个Visit 可以有多个用户。

    【讨论】:

    • 要学究起来,遵守 Django 的命名约定可能会更好。所以,"visitsAsUser" 类似于"visits_as_user"。我个人更喜欢"user_visits",但这只是个人喜好。
    • 遵守 Django 的约定也可以防止管理中的事情看起来很有趣。但是我当时有很多代码使用驼峰式约定,所以习惯了。
    • 只是觉得值得一提 :) 命名约定不仅让观众更容易阅读代码,而且作者本人也更容易阅读代码。
    【解决方案2】:

    如果 visit 在您的应用程序中是一个强大的概念,那么按照您定义的方式使用它可能是有意义的:visit 由一个“用户用户”和一个“用户访问者”组成'.

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

    无论如何,关于related_name,如果您不会从用户访问visits,您可以disable the backwards relation,或者使用一个合理的名称,例如如visits_to_self on user 和visits_to_others on visitor,这将允许查看谁通过调用user.visits_to_self 访问了用户以及用户通过user.visits_to_others 访问了谁。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多