2017-08-14 5 views
2

プロローグ:非汎用ビュー/ビューセットでページネーションを使用するにはどうすればいいですか?

ともここで適用することができます:私は、複数の柱に生じたこの質問を見てきました

私は上記の質問に私の答えを統一するSOマニュアルの例を構成しているが、文書は2017年8月8日にシャットダウンを取得するために、私はthis widely upvoted and discussed meta answerの提案に従うと、私を変えていきます自己回答の投稿への例

もちろん、私は他のアプローチも見て嬉しいです!


質問:Djangoの休憩Frameworkプロジェクトに:

私は非汎用ビュー/ビューセット(APIViewなど)を使用します。
私はpagination documentationに読んで:あなたは汎用ビューまたはビューセットを使用している場合

ページネーションのみが自動的に実行されます。通常のAPIViewを使用している場合は、改ページされたレスポンスを確実に返すために、ページ分割APIを自分で呼び出す必要があります。例として、mixins.ListModelMixingenerics.GenericAPIViewクラスのソースコードを参照してください。

引き続き非一般的なビュー/ビューセットを使用できますか?
ページングを実装するにはどうすればよいですか?

答えて

4

我々は車輪の再発明する必要なしに解決策を見つけることができます。

  1. のはgenericsページネーションを実装する方法について見てみましょう: django-rest-framework/rest_framework/generics.py
    これはまさに私たちの見解にも使われる予定です!
    settings.py

  2. は、我々は、以下のようなグローバル改ページを設定していると仮定しましょう

    REST_FRAMEWORK = { 
        'DEFAULT_PAGINATION_CLASS': 
         'rest_framework.pagination.DESIRED_PAGINATION_STYLE', 
        'PAGE_SIZE': 100 
    } 
    
  3. たちのビュー/ビューセットのコードを膨張させないために、我々は店にカスタムミックスインを作成することができます私たちの改ページコード:views.pyに続いて

    class MyPaginationMixin(object): 
    
        @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) 
    
  4. from rest_framework.settings import api_settings 
    from rest_framework.views import APIView 
    
    from my_app.mixins import MyPaginationMixin 
    
    class MyView(APIView, MyPaginationMixin): 
        queryset = OurModel.objects.all() 
        serializer_class = OurModelSerializer 
        pagination_class = api_settings.DEFAULT_PAGINATION_CLASS 
    
        # We need to override the get method to insert 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) 
    

そして今、我々は、ページネーションとAPIViewを持っています。

+0

'NoneType'オブジェクトには属性 'paginate_queryset'がありません。このエラーが発生しました – Thameem

+0

@Thameemあなたが行ったことを見るためのコードなしであなたを手助けするのは少し難しいです...問題が解決しない場合は、ここで質問をすることを検討してください。 –

+0

あなたのメッセージのための@thanks私はこの応答を逃したreturn self.get_paginated_response(serializer.data)。ありがとう。その今働いて – Thameem

関連する問題