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

时间:2015-02-26 22:34:15

标签: python django django-models

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

id | user_id | follower_id
1  | 20      | 45
2  | 20      | 53
3  | 32      | 20

为此,我做了以下事情:

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)

其中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'.

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

1 个答案:

答案 0 :(得分:6)

您需要添加related_name

class UserFollower(models.Model):
    user_id = models.ForeignKey(User,related_name="users")
    follower_id = models.ForeignKey(User,related_name="followers")

为什么会这样

  

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

     

但是如果模型中有多个外键,则django无法使用   为外键管理器生成唯一的名称。你可以帮忙   将“related_name”参数添加到的foreignkey字段定义中   你的模特。

所以,你可以在django docs

中阅读更多内容