2017-06-05 122 views
1

我使用Django REST frameworkdjangorestframework-csv以默認的分頁設置,但是當請求的格式爲「CSV」時,則不需要在Paginaion。可以禁用與分頁:Django rest框架:如何在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有新的更新代碼中的bug,請複製新的一個。 – 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) 
相關問題