2017-02-21 119 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) 
相關問題