Как добавить один объект в Django Model, которая имеет ManyToManyField?

Я пытаюсь создать сайт типа социальной сети, который позволит пользователю следовать и не следовать за другим пользователем. followers имеет поле ManyToManyField, потому что user может иметь много последователей.

models.py

class Follower(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, default="")
    followers = models.ManyToManyField(User, related_name="followers")

views.py

def username(request, user):
    #get user
    user = get_object_or_404(User.objects, username=user)
    posts = Post.objects.filter(user=user).order_by('-date_and_time')

    #follow button code
    follow_or_unfollow = ''
    try:
        following = get_object_or_404(Follower, Q(
            user=user) & Q(followers=request.user))
        print(following)
    except: 
        following = False

    if following:
        follow_or_unfollow = True
    else:
        follow_or_unfollow = False

    if request.POST.get('follow'):
        follower = Follower.objects.create(user=request.user)
        follower.followers.add(*user)
        follow_or_unfollow = False
    elif request.POST.get('unfollow'):
        follow_or_unfollow = True
        #following.delete()

Когда он получает POST-запрос 'follow', я хочу, чтобы он добавил пользователя, который отправил его (тот, который вошел в систему), в число последователей. Сейчас я получаю эту ошибку, когда пытаюсь это сделать.

TypeError: django.db.models.fields.related_descriptors.create_forward_many_to_many_manager.<locals>.ManyRelatedManager.add() argument after * must be an iterable, not User

Я знаю, что здесь говорится, что он должен быть итерируемым, но есть ли способ просто добавлять по одному объекту за раз. Также, как можно удалить этот конкретный объект?

В аргументах * преобразует список в отдельные аргументы. Например-

lst = [1,2,3,4,5]

function(*lst)

можно прочитать как

function(1,2,3,4,5)

Вы использовали follower.followers.add(*user). Следовательно, user должен быть итерабельным, чтобы его можно было распаковать и передать в виде списка или аргументов. Но user - это один объект User.

В этом случае следует просто использовать follower.followers.add(user).

Вернуться на верх