2016-03-06 21 views
10

Ich habe eine sehr einfache APIView, aber ich weiß nicht, wie man die Seitennummerierung hier einrichten. In diesem Szenario wähle ich eine Event mit gegeben pk, dann bekomme ich alle NewsItems zugewiesen Event.Django Rest Framework - APIView Seitennummerierung

pagination_class = LimitOffsetPagination funktioniert OK, wenn ich am Anfang in ListCreateAPIView, z. queryset = Event.objects.all() aber nicht mit benutzerdefinierten get:

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 

Gelöst:

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 
+2

Bewertung dieser Diskussion sieht, wie diese Jungs Ihr Problem lösen https://github.com/tomchristie/django-rest-framework/issues/ 3030 – inlanger

+0

Hey, @ user3128673 Ich habe mich gefragt, ob du meine Antwort hilfreich gefunden hast. –

Antwort

4

Ich habe ein Q&A style example zu diesem Thema erstellt.
Als eine Art Zusammenfassung:

den Django Ruhe Frameworks Quellcode Durch die Verwendung und wie sie Paginierung handhaben, wir schaffen die gleichen Methoden in unserer Ansichtsklasse und wir nutzen sie, auf die gleiche Art und Weise Ihre Lösung die Standardmethoden verwendet:

aus dem oben genannten Dok:

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) 
Verwandte Themen