Я расширил UserModel следующим образом:
# users/models.py
from django.contrib.auth.models import AbstractUser
from django.db import models
class CustomUser(AbstractUser):
# add additional fields in here
credit = models.IntegerField(default=200)
follow = models.ManyToManyField('self', related_name='follow')
def __str__(self):
return self.username
Но я застрял в том, как мне добавить / удалить подписчика.Я создал представление с:
@login_required
def follow(request, user_id):
user = get_object_or_404(CustomUser, pk=user_id)
if CustomUser.objects.filter(follow=user.pk).exists():
request.user.follow.remove(user)
else:
request.user.follow.add(user)
return redirect('profil', user_id)
Проблема:
Допустим, request.user.pk
равно 1, а user_id
равно 2.
Для add
часть (в else
), я ожидаю новую строку в базе данных с from_customuser_id=1
и to_customuser_id=2
, однако она создает две строки:
одна с from_customuser_id=1
и from_customuser_id=2
как и ожидалось
один с from_customuser_id=2
и from_customuser_id=1
, который мне не нужен.
А для части remove
(в if
) я бы ожидал, что она удалит только строку
from_customuser_id=1
и from_customuser_id=2
Но он удаляет две строки.
Я прочитал документ о связях моделей django , но не нашел, как решить эту проблему.
Вопрос:
Как мне обновить мой код, чтобы метод add
вставлял только одну строку с from_customuser_id=1
, from_customuser_id=2
и метод remove
только для удаленияэта строка (при условии, что текущий пользователь имеет идентификатор 1).
Не уверен, что это актуально, но для полноты картины это связанная часть моего urls.py:
path('follow/<int:user_id>', views.follow, name='follow'),
path('unfollow/<int:user_id>', views.follow, name='unfollow'),
И вот как я их называю в шаблонах:
{% if follow %}
<a href="{% url 'follow' user_profil.id %}">
Unfollow {{ user_profil.username }}
</a>
{% else %}
<a href="{% url 'unfollow' user_profil.id %}">
Follow {{ user_profil.username }}
</a>
{% endif %}