Создание 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")
Вернуться на верх