Создание API, добавляющего экземпляры в поля ManyToMany модели в django rest framework
Я создаю сайт для просмотра фильмов, на котором есть пользователи и фильмы, и в модели пользователя есть поле ManyToMany, которое ссылается на модель фильма. Оно называется WatchList, и аутентифицированный пользователь может добавить любой фильм, который он хочет, в этот список просмотра.
Моя проблема в том, что мне нужен API, который только получает ID фильма и добавляет его в список просмотра пользователя.
вот мои модели и сериализаторы, и я пытаюсь сделать представление для реализации этого API.
# models.py
class Film(models.Model):
filmID = models.AutoField(primary_key=True)
title = models.CharField(max_length=150)
# ...
class User(AbstractBaseUser, PermissionsMixin):
userID = models.AutoField(primary_key=True)
username = models.CharField(max_length=100, unique=True, validators=[RegexValidator(regex="^(?=[a-z0-9._]{5,20}$)(?!.*[_.]{2})[^_.].*[^_.]$")])
email= models.EmailField(max_length=100, unique=True, validators=[EmailValidator()])
name = models.CharField(max_length=100)
watchList = models.ManyToManyField(Film)
objects = UserManager()
USERNAME_FIELD = 'username'
# serializers.py
class WatchListSerializer(serializers.ModelSerializer):
class FilmSerializer(serializers.ModelSerializer):
model = Film
fields = ('filmID', 'title',)
read_only_fields = ('filmID', 'title')
film_set = FilmSerializer(read_only=True, many=True)
class Meta:
model = get_user_model()
fields = ('userID', 'film_set')
read_only_fields = ('userID',)
# views.py
class WatchListAddView(...):
pass
Сериализатор можно изменить. но это как бы показывает, каким я хочу видеть api. часть проверки подлинности уже сделана, так что представьте, что любой запрос к представлению исходит от аутентифицированного пользователя.
Я бы не рекомендовал исправлять это напрямую и вместо этого создать отдельную конечную точку для добавления удаления данных из этого поля.
В вашем случае это будет выглядеть следующим образом. Я показываю только небольшой рабочий пример, вы можете настроить его под свои нужды
from django.shortcuts import get_object_or_404
from rest_framework import viewsets
from rest_framework.decorators import action
from rest_framework.response import Response
class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all()
@action(detail=True,
methods=['POST'])
def add_film_to_watch_list(self, request, **kwargs):
film = get_object_or_404(klass=Film, filmID=kwargs.get('filmID'))
user = self.get_object()
user.watchList.add(film)
return Response("Success")