Как реализовать последователей/подписчиков в Django

Я хочу реализовать функцию «последователи/подписчики» в своем приложении Django.

У меня есть класс UserProfile для каждого Пользователя (django.contrib.auth.User):

class UserProfile(models.Model):
    user = models.ForeignKey(User, unique = True, related_name = 'user')
    follows = models.ManyToManyField("self", related_name = 'follows')

Итак, я попытался сделать это в оболочке Python:

>>> user_1 = User.objects.get(pk = 1) # <-- mark
>>> user_2 = User.objects.get(pk = 2) # <-- john
>>> user_1.get_profile().follows.add(user_2.get_profile())
>>> user_1.get_profile().follows.all()
[<UserProfile: john>]
>>> user_2.get_profile().follows.all()
[<UserProfile: mark>]

Но, как видите, когда я добавляю нового пользователя в поле follows пользователя, также добавляется симметричное отношение с другой стороны. Буквально: если пользователь1 следует за пользователем2, то и пользователь2 следует за пользователем1, а это неправильно.

Где моя ошибка? У вас есть способ реализовать последователей и правильно следовать?

Спасибо вам, ребята.


person Fred Collins    schedule 02.06.2011    source источник


Ответы (2)


Установите для параметра ssymmetric значение False в отношении Many2Many:

follows = models.ManyToManyField('self', related_name='follows', symmetrical=False)
person mouad    schedule 02.06.2011
comment
В чем разница между симметричным=False и related_name='fie+'? - person danielrvt; 07.08.2012

В дополнение к ответу Муада, могу ли я предложить выбрать другое *related_name*: если Марк подписывается на Джона, то Марк является одним из подписчиков Джона, верно?

person XORcist    schedule 02.06.2011