Как объединить два APIView класса в DRF, с разными сериализаторами

как вывести данные разных сериализаторов и разных функций представления на одной странице

views.py

class UserCoursesAPIView(generics.ListAPIView):
    serializer_class = AccountCoursesSerializer
    def get_queryset(self):
        course_slug = self.kwargs.get('course_slug')
        return Courses.objects.filter(slug=course_slug)

    serializer_class = VideoSerializer
    def get_queryset(self):
        course_slug = self.kwargs.get('course_slug')
        course = get_object_or_404(Courses, slug=course_slug)
        return Videos.objects.filter(course_id=course.pk)

serializers.py

class AccountCoursesSerializer(serializers.ModelSerializer):
    class Meta:
        model = Courses
        fields = ['name', 'information']

class VideoSerializer(serializers.ModelSerializer):
    class Meta:
        model = Videos
        fields = ['video']

Чтобы вывести данные разных функций представления и разных сериализаторов на одной странице, можно использовать APIView вместо ListAPIView. APIView предоставляет больше гибкости в обработке запросов и ответов.

Вот пример того, как это можно реализовать:

views.py

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status

from .serializers import AccountCoursesSerializer, VideoSerializer
from .models import Courses, Videos


class UserCoursesAPIView(APIView):
    def get(self, request, course_slug):
        course = get_object_or_404(Courses, slug=course_slug)
        courses_serializer = AccountCoursesSerializer(course)
        videos_serializer = VideoSerializer(Videos.objects.filter(course_id=course.pk), many=True)
        return Response({
            'courses': courses_serializer.data,
            'videos': videos_serializer.data
        }, status=status.HTTP_200_OK)

В этом представлении мы используем APIView и вручную сериализуем данные курсов и видео с помощью AccountCoursesSerializer и VideoSerializer. Затем мы возвращаем сериализованные данные в виде словаря.

urls.py

from django.urls import path

from .views import UserCoursesAPIView

urlpatterns = [
    path('courses/<slug:course_slug>/', UserCoursesAPIView.as_view()),
]

Теперь вы можете получить данные курсов и видео по указанному course_slug в одном запросе. Ответ будет содержать словарь с ключами courses и videos, которые будут содержать сериализованные данные курсов и видео соответственно. Надеюсь что помог!

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