2016-03-06 19 views
10

私は非常に単純なAPIViewですが、ここでページ設定を設定する方法はわかりません。 このシナリオでは、Eventpkを選択した場合、NewsItemsはすべてこのEventに割り当てられます。Django Rest Framework - APIViewページネーション

pagination_class = LimitOffsetPagination作品最初はクエリーセットを定義するときはListCreateAPIViewになります。 queryset = Event.objects.all()ではなく、カスタム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 

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

レビューこの議論を、この男はあなたの問題を解決https://github.com/tomchristie/django-rest-framework/issues/のように見えます3030 – inlanger

+0

こんにちは、@ user3128673私はあなたが私の答えが役に立つかどうかを知りたいと思っていました。 –

答えて

4

私はこのテーマにQ&A style exampleを作成しました。

Djangoの残りのフレームワークのソースコードを利用して、彼らはページネーションを処理する方法を、私たちは私たちのビュークラス内の同じメソッドを作成して、私たちはあなたのソリューションは、デフォルトのメソッドを使用するのと同じ方法で、それらを使用することにより:ソート要約として
:上記のドキュメントから撮影

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) 
関連する問題