与自身的多对多关系无法使用相关的name属性

时间:2017-02-21 21:01:40

标签: django models

我正在尝试制作Twitter克隆。

该应用有一系列用户,每个用户都有一个用户个人资料。 UserProfile模型如下

class UserProfiles(models.Model):
    authenticated_user = models.OneToOneField(User, related_name="user_profile")

    handle = models.CharField(max_length=50)
    display_name = models.CharField(max_length=50)

    following = models.ManyToManyField("self", related_name="followers", null=True)

    def __str__(self):
        return self.authenticated_user.handle

“follow”属性是与UserProfiles的多对多关系,因为每个用户配置文件都可以跟随许多其他配置文件,并且许多配置文件可以跟随另一个配置文件。

如果我有一个UserProfiles实例,我们称之为current_user,我可以通过

找到它所关注的配置文件数量
current_user.following.count

我还想告诉用户有多少人关注他们。由于related_name参数设置为“followers”,因此我可以通过执行来获得关注者数量

current_user.followers.count

然而,这会返回一个错误,“'UserProfiles'对象没有属性'关注者'”

为什么不能做我的工作?我该怎么做呢?

1 个答案:

答案 0 :(得分:1)

与self的默认m2m关系在django中是对称的。如果你看一下documentation

  

当Django处理此模型时,它会识别出它自身有ManyToManyField,因此,它不会向person_set类添加Person属性。相反,ManyToManyField被假定为symmetrica l - 也就是说,如果我是你的朋友,那么你就是我的朋友。

     

如果您不希望与self的多对多关系具有对称性,请将symmetrical设置为False。这将迫使Django为反向关系添加描述符,允许ManyToManyField关系是非对称的。

在您的情况下,由于m2m关系的symmetrical属性为true,表示:

A is following B => B is following A

但如果您需要followingfollowers关系,则需要设置symmetrical=False

following = models.ManyToManyField("self", related_name="followers", 
                                   symmetrical=False, null=True)