Как добавить один объект в 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)
.