2017-02-21 5 views
1

Я пытаюсь сделать клон 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 

«Следующий» атрибут является многим-ко-многим с UserProfiles, так как каждый профиль пользователя может следовать многим другим профилям, и многие профили могут быть следующими другим профилем.

Если у меня есть экземпляр UserProfiles, мы будем называть его current_user, я могу найти, сколько профилей он следующий, делая

current_user.following.count 

Я также хочу, чтобы иметь возможность сообщить пользователю, сколько людей Следуя за ними. Поскольку related_name аргумент установлен в «последователей», кажется разумным, что я могу получить количество последователей, делая

current_user.followers.count 

Это, однако, возвращает ошибку, «объект„UserProfiles“не имеет атрибута„последователей“ "

Почему я не работаю? Что я могу сделать вместо этого?

+0

Вы запустили 'makemigrations' и' migrate' после добавления 'related_name'? –

ответ

0

По умолчанию отношение m2m к self симметрично в django. Если вы посмотрите на documentation:

Когда Django обрабатывает эту модель, она определяет, что она имеет ManyToManyField на себя, и, как следствие, он не добавляет атрибут к Person класса person_set. Вместо этого ManyToManyField считается symmetrica l - то есть, если я ваш друг, то вы мой друг.

Если вы не хотите, чтобы симметрия во многих отношениях была связана с self, установите symmetrical на номер False. Это заставит Django добавить дескриптор для обратной связи, позволяя отношениям ManyToManyField быть несимметричными.

В вашем случае, поскольку symmetrical атрибут для отношений m2m верно, то это означает:

A is following B => B is following A

Но если вам нужны оба following и followers отношений необходимо установить symmetrical=False:

following = models.ManyToManyField("self", related_name="followers", 
            symmetrical=False, null=True) 
Смежные вопросы