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?
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 PageNumberPagination
s 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