2017-02-21 56 views
1

我想制作一个Twitter克隆。与自身的多对多关系无法利用相关的名称属性

该应用程序有一系列用户,每个用户都有一个用户配置文件。该用户配置模型如下

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 

的“下面的”属性是一个的UserProfiles许多一对多关系,因为每个用户简档可以按照许多其他轮廓,并且许多轮廓可以下列另一个配置文件。

如果我的UserProfiles的一个实例,我们把它叫做CURRENT_USER,我能找到多少型材它是由做

current_user.following.count 

下面我也希望能够告诉用户有多少人跟着他们。由于related_name参数设置为“追随者”,它似乎是合理的,我可以做

current_user.followers.count 

这让追随者的数量,然而,返回一个错误,“‘的UserProfiles’对象有没有属性‘追随者’ “

为什么我不工作?我能做些什么呢?

+0

您在添加'related_name'后运行'makemigrations'和'migrate'? –

回答

0

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

当Django处理这个模型,它标识,它有一个ManyToManyField本身,作为一个结果,它不会添加一个person_set属性的Person类。相反,ManyToManyField被假定为symmetrica l - 也就是说,如果我是你的朋友,那么你是我的朋友。

如果您不想在与self的多对多关系中使用对称性,请将symmetrical设置为False。这将迫使Django为反向关系添加描述符,允许ManyToManyField关系不对称。

在你的情况下,由于symmetrical属性为M2M的关系是真实的,它意味着:

A is following B => B is following A

但是如果你需要同时followingfollowers关系,你需要设置symmetrical=False

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