2017-06-05 126 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) 
相关问题