Django Rest Framework csv模块使用分页模块



你好,我正在使用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。我想让渲染器返回csv中的所有内容。目前它只返回当前页面。有人能帮忙吗?

我知道这个问题发布已经很久了,但我也有同样的要求。

我最终覆盖了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

您可以使用python-csv模块转换页面并以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

最新更新