2016-03-06 39 views
10

Mam bardzo prosty APIView, ale nie wiem jak ustawić paginację tutaj. W tym scenariuszu wybieram Event z podanym pk, a następnie otrzymuję wszystkie NewsItems przypisane do tego Event.Django Rest Framework - APIView Pagination

pagination_class = LimitOffsetPagination działa poprawnie, gdy zdefiniuję zestaw zapytań na początku w ListCreateAPIView, np. queryset = Event.objects.all() ale nie ze zwyczajem 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 

rozwiązany:

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

recenzję tej dyskusji, wygląda tak faceci rozwiązać swój problem https://github.com/tomchristie/django-rest-framework/issues/ 3030 – inlanger

+0

Hej, @ user3128673 Zastanawiałem się, czy moja odpowiedź była pomocna. –

Odpowiedz

4

Stworzyłem Q&A style example na ten temat.
Jako podsumowanie sortowania:

wykorzystując kod źródłowy Django Rest ram i jak radzą sobie paginacji, tworzymy takie same metody wewnątrz naszej klasie widoku i używamy ich w taki sam sposób, rozwiązanie wykorzystuje metody domyślne:

Zrobione z wyżej wymienionym dokumencie:

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) 
Powiązane problemy