在Django中从同一个Model中添加两个ForeignKey字段

New*_*wtt 1 python django django-models

我正在尝试在Django中创建如下的用户和关注者关系

id | user_id | follower_id
1  | 20      | 45
2  | 20      | 53
3  | 32      | 20
Run Code Online (Sandbox Code Playgroud)

为此,我做了以下事情:

class UserFollower(models.Model):
    user_id = models.ForeignKey(User)
    follower_id = models.ForeignKey(User)

    def __str__(self):
        return "{} following {}".format(self.follower_id.username, self.user_id.username)
Run Code Online (Sandbox Code Playgroud)

这里Userdjango.contrib.auth.models.User模型.在运行时makemigrations,我收到以下错误:

ERRORS:
AppName.UserFollower.follower_id: (fields.E304) Reverse accessor for 'UserFollower.follower_id' clashes with reverse accessor for 'UserFollower.user_id'.

HINT: Add or change a related_name argument to the definition for 'UserFollower.follower_id' or 'UserFollower.user_id'.
AppName.UserFollower.user_id: (fields.E304) Reverse accessor for 'UserFollower.user_id' clashes with reverse accessor for 'UserFollower.follower_id'.
HINT: Add or change a related_name argument to the definition for 'UserFollower.user_id' or 'UserFollower.follower_id'.
Run Code Online (Sandbox Code Playgroud)

我的问题是,为什么这是错的?我该如何解决这个问题?

lev*_*evi 6

你需要添加 related_name

class UserFollower(models.Model):
    user_id = models.ForeignKey(User,related_name="users")
    follower_id = models.ForeignKey(User,related_name="followers")
Run Code Online (Sandbox Code Playgroud)

为什么这个

"如果模型具有ForeignKey,则外键模型的实例将有权访问返回第一个模型的所有实例的Manager.默认情况下,此Manager名为FOO_set,其中FOO是源模型名称,小写."

但是如果模型中有多个外键,则django无法为外键管理器生成唯一的名称.您可以通过向模型中的foreignkey字段定义添加"related_name"参数来提供帮助.

所以,你可以在django docs中阅读更多内容