使用分页模块的 Django-Rest-Framework csv 模块
Django-Rest-Framework csv module using paginated module
您好,我正在使用 django-rest-framework-csv
模块,我已按照说明使用以下代码创建分页渲染器:
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)
正如我在他们的 github 网站上找到的那样:django-rest-framework-csv。我想让渲染器做的是 return csv 中的所有内容。目前只有 return 当前页面。有人可以帮忙吗?
您可以使用 python csv 模块转换页面和 return in csv 。我还没有测试过,但我认为它应该可以工作。我假设使用制表符分隔符,但您可以更改它。
import csv
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, [])
csv_input= super(PaginatedCSVRenderer, self).render(data, media_type, renderer_context)= csv.reader(open(txt_file, "rb"), delimiter = '\t')
csv_output = csv.writer(csv_input)
return csv_output
我知道问题发布已经很久了 - 但我有同样的要求。
我最终覆盖了我的 PageNumberPagination
自定义实现的 get_page_size
方法。
这是我所做的:
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)
您现在可以将其用作 pagination_class。
示例:
from rest_framework import generics
class SomeApi(generics.ListCreateAPIView):
permission_classes = ...
filter_backends = ...
pagination_class = CustomPageNumberPagination
您好,我正在使用 django-rest-framework-csv
模块,我已按照说明使用以下代码创建分页渲染器:
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)
正如我在他们的 github 网站上找到的那样:django-rest-framework-csv。我想让渲染器做的是 return csv 中的所有内容。目前只有 return 当前页面。有人可以帮忙吗?
您可以使用 python csv 模块转换页面和 return in csv 。我还没有测试过,但我认为它应该可以工作。我假设使用制表符分隔符,但您可以更改它。
import csv
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, [])
csv_input= super(PaginatedCSVRenderer, self).render(data, media_type, renderer_context)= csv.reader(open(txt_file, "rb"), delimiter = '\t')
csv_output = csv.writer(csv_input)
return csv_output
我知道问题发布已经很久了 - 但我有同样的要求。
我最终覆盖了我的 PageNumberPagination
自定义实现的 get_page_size
方法。
这是我所做的:
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)
您现在可以将其用作 pagination_class。
示例:
from rest_framework import generics
class SomeApi(generics.ListCreateAPIView):
permission_classes = ...
filter_backends = ...
pagination_class = CustomPageNumberPagination