Django-Rest-Framework CSV 模块使用分页模块

4

你好,我正在使用 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中返回所有内容。目前它只返回当前页面。有人可以帮忙吗?

2个回答

1
你可以使用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

渲染器已经返回 CSV,但它只返回当前页面中的记录。我想看看是否可以让渲染器读取所有页面并将所有记录输出到 CSV。 - jangeador

1

我知道这个问题发布已经有很长时间了,但是我也有同样的需求。

最终,我重写了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)

你现在可以将此作为分页类来使用。
例如:
from rest_framework import generics


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接