Django Rest Framework – APIView Pagination

Tengo un APIView muy simple, pero no sé cómo configurar la paginación aquí. En este escenario selecciono un Event con un pk dado, luego obtengo todos los NewsItems asignados a este Event .

pagination_class = LimitOffsetPagination funciona bien cuando defino queryset al principio en ListCreateAPIView , por ej. queryset = Event.objects.all() pero no con get personalizado:

 class EventNewsItems(APIView): pagination_class = LimitOffsetPagination def get(self, request, pk, format=None): #user = request.user event = Event.objects.get(pk=pk) news = event.get_news_items().all() serializer = NewsItemSerializer(news, many=True, context={'request':request}) response = Response(serializer.data, status=status.HTTP_200_OK) return response 

Resuelto

 def get(self, request, pk, format=None): #user = request.user event = Event.objects.get(pk=pk) news = event.get_news_items().all() paginator = LimitOffsetPagination() result_page = paginator.paginate_queryset(news, request) serializer = NewsItemSerializer(result_page, many=True, context={'request':request}) response = Response(serializer.data, status=status.HTTP_200_OK) return response 

He creado un ejemplo de estilo de preguntas y respuestas sobre este tema.
Como un resumen de la clasificación:

Al utilizar el código fuente de Django Rest Frameworks y cómo manejan la paginación, creamos los mismos métodos dentro de nuestra clase de vista y los usamos, de la misma manera que su solución usa los métodos predeterminados:

Tomado del citado documento:

 from rest_framework.settings import api_settings from rest_framework.views import APIView class MyView(APIView): queryset = OurModel.objects.all() serializer_class = OurModelSerializer pagination_class = api_settings.DEFAULT_PAGINATION_CLASS # cool trick right? :) # We need to override get method to achieve pagination def get(self, request): ... page = self.paginate_queryset(self.queryset) if page is not None: serializer = self.serializer_class(page, many=True) return self.get_paginated_response(serializer.data) ... Do other stuff needed (out of scope of pagination) # Now add the pagination handlers taken from # django-rest-framework/rest_framework/generics.py @property def paginator(self): """ The paginator instance associated with the view, or `None`. """ if not hasattr(self, '_paginator'): if self.pagination_class is None: self._paginator = None else: self._paginator = self.pagination_class() return self._paginator def paginate_queryset(self, queryset): """ Return a single page of results, or `None` if pagination is disabled. """ if self.paginator is None: return None return self.paginator.paginate_queryset(queryset, self.request, view=self) def get_paginated_response(self, data): """ Return a paginated style `Response` object for the given output data. """ assert self.paginator is not None return self.paginator.get_paginated_response(data)