Как объединить два 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
, которые будут содержать сериализованные данные курсов и видео соответственно.
Надеюсь что помог!