Модель подписчика пользователя на Django.Невозможно использовать add () для ManyToManyField, в котором указана промежуточная модель.Вместо этого используйте менеджер учетных записей. - PullRequest
0 голосов
/ 02 июня 2018

Я новичок в Django. Прошу прощения за любые глупые ошибки в коде или логике,

Intro: Я пытаюсь создать модель подписчика в Django.Где пользователи могут подписаться и отписаться от других пользователей на сайтах

Ошибка: Я сделал models для подписки / отмены подписки. Я также сделал views Я получаю эту ошибку

AttributeError at /accounts/admin/follow/
Cannot use add() on a ManyToManyField which specifies an intermediary model. Use accounts.Contact's Manager instead. 

* * * * * * * * * * * * * obj.followers.add(user) * * * * * * * * * * * * * * * * * * * * * * * * * * Пример:

models.py
from django.contrib.auth.models import User
class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    city = models.CharField(max_length=100)
    country = models.CharField(max_length=100)
    def get_absolute_url(self):
        return reverse('accounts:profile', kwargs={'username': self.user.username})

class Contact(models.Model):
    user_from = models.ForeignKey(User, related_name='suppporter')
    user_to = models.ForeignKey(User, related_name='leader')

    def __str__(self):
        return '{} follows {}'.format(self.user_from, self.user_to)


User.add_to_class('following',
                  models.ManyToManyField('self', through=Contact, related_name='followers', symmetrical=False))
* 1021.* Я думаю, что models.py может быть хорошим.Я считаю, что вина в моих взглядах.Ниже мой view.py
class FollowToggle(LoginRequiredMixin, RedirectView):

    def get_redirect_url(self, *args, **kwargs):
        username = self.kwargs.get('username')
        print(username + " This is the user who will be followed") # This prints correct
        profile = get_object_or_404(Profile, user__username=username)
        print(profile) # This prints correct
        obj = get_object_or_404(User, username=username)
        print(obj) # This prints correct
        url_ = profile.get_absolute_url()
        print(url_) # This prints correct
        user = self.request.user
        print(user) # This prints correct
        if user.is_authenticated():
            if user in obj.followers.all(): # I know this is the source of the error.
                obj.followers.remove(user)
            else:
                obj.followers.add(user)
        return url_

Ниже Urls.py на всякий случай

url(r'^(?P<username>[-\w]+)/follow/$', views.FollowToggle.as_view(), name='follow'),

Ответы [ 2 ]

0 голосов
/ 11 апреля 2019

В Django 2.2 вы можете использовать методы add, remove и set ( Документы )

Вы также можете использовать add (), create ()или set () для создания отношений, если вы укажете through_defaults для любых обязательных полей

0 голосов
/ 02 июня 2018

Вы не можете использовать add и remove метод для множества отношений, определенных в третьей модели.Из документов :

В отличие от обычных полей «многие ко многим», вы не можете использовать add (), create () или set () для создания отношений

Вместо этого вы должны использовать Contact manager:

if user.is_authenticated():
    if user in obj.followers.all(): # I know this is the source of the error.
        Contact.objects.filter(user_to=obj, user_from=user).delete()
    else:
        Contact.objects.create(user_to=obj, user_from=user)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...