2017-06-05 35 views
1

私はDjango REST frameworkdjangorestframework-csvをデフォルトのページネーション設定で使用していますが、リクエストが "CSV"形式の場合はページングする必要はありません。それは動的に変更することが可能ですDjango rest framework:ModelViewSetのページ設定をオフ/オンにする方法

pagination_class = None

:で改ページを無効にすることは可能ですか?

class ObjectViewSet(BaseViewSet, viewsets.ModelViewSet): 

    queryset = Object.objects.none() 
    serializer_class = ObjectSerializer 
    pagination_class = None # if format is "CSV" 
    # pagination_class = None # if fromat isn't "CSV" 

ありがとうございます。

+0

query_paramsにはPAGE_SIZEは、keyerror.iは新しいコードを更新してき上げていないときだけでバグを見つけ、コピーしてください新しいもの – Ykh

答えて

2

あなただけの動的クライアントによって改ページの上またはオフにしたい場合は、カスタムページネーションクラスは次のように指定できます。

class Pagination(PageNumberPagination): 
    page_size_query_param = 'page_size' 
    max_page_size = 100 

    def get_page_size(self, request): 
     if self.page_size_query_param: 
      page_size = min(int(request.query_params.get(self.page_size_query_param, self.page_size)), 
         self.max_page_size) 
      if page_size > 0: 
       return page_size 
      elif page_size == 0: 
       return None 
      else: 
       pass 
     return self.page_size 

このクラスをpagination_classとして使用し、リクエストURL「http://www.example.com/some_object/?page_size=0」によってページ番号をオフにすることはできますか?page_size = 0はページ設定を無効にします。リクエストフォーマットがCVSの場合にページネーションを無効にしたい場合は、danilkeが言ったことを試すことができます。

0

ソリューションは、次のとおりです。

class PaginatedCSVRenderer (CSVRenderer): 
    results_field = 'results' 

    def render(self, data, *args, **kwargs): 
     if not isinstance(data, list): 
      data = data.get(self.results_field, []) 
     return super(PaginatedCSVRenderer, self).render(data, *args, **kwargs) 

とより:

class ObjectViewSet(BaseViewSet, viewsets.ModelViewSet): 

    queryset = Object.objects.none() 
    serializer_class = ObjectSerializer 
    renderer_classes = (JSONRenderer, PaginatedCSVRenderer) 

と設定から削除します。

'PAGE_SIZE': 10, 
1

一つのオプションは、動的no_pageクエリパラメータを設定することで、ビューに改ページを無効にするには、次のようになります。

def paginate_queryset(self, *args, **kwargs): 
    if 'no_page' in self.request.query_params: 
     return None 
    return super().paginate_queryset(*args, **kwargs) 
関連する問題