Search code examples
pythondjangopaginationdjango-rest-frameworkexport-to-csv

Django-Rest-Framework csv module using paginated module


Hello I am using the django-rest-framework-csv module and I have followed the instructions to create a Paginated renderer using this code:

from rest_framework_csv.renderers import CSVRenderer

class PaginatedCSVRenderer (CSVRenderer):
    results_field = 'results'

    def render(self, data, media_type=None, renderer_context=None):
        if not isinstance(data, list):
            data = data.get(self.results_field, [])
        return super(PaginatedCSVRenderer, self).render(data, media_type, renderer_context)

as I found it on their github site: django-rest-framework-csv . What I want the renderer to do is to return everything in the csv. Currently it only returns the current page. Can someone help?


Solution

  • I know its been a long time since the question was posted - but I had the same requirement.

    I ended up overriding get_page_size method of my PageNumberPaginations custom implementation.

    Here is what I did:

    from rest_framework.pagination import PageNumberPagination
    from rest_framework.settings import api_settings
    from rest_framework_csv.renderers import CSVRenderer
    
    
    class CustomPageNumberPagination(PageNumberPagination):
        page_size = 20
        page_size_query_param = 'page_size'
        max_page_size = 50
    
        def get_page_size(self, request):
        '''
        Set page size to unlimited (by returning None) when request format is CSV.
        '''
            # My version limits this only for admin users but feel free to change it.
            if request.user and request.user.is_staff:
                try:
                    data_format = request.query_params[api_settings.URL_FORMAT_OVERRIDE]
                    if data_format == CSVRenderer.format:
                        return None
                except (KeyError, ValueError):
                    pass
    
            return super(CustomPageNumberPagination, self).get_page_size(request)
    

    You can now use this as a pagination_class.

    Example:

    from rest_framework import generics
    
    
    class SomeApi(generics.ListCreateAPIView):
        
        permission_classes = ...
        filter_backends = ...
        pagination_class = CustomPageNumberPagination