如何根据请求参数使用自定义渲染器?

时间:2017-12-12 21:37:15

标签: django csv django-rest-framework django-views

目标:

让每个端点在参数中使用export=csv,使用自定义渲染器输出CSV文件而不是Json数据,而不是更改每个视图的代码

设置另一个渲染器似乎是最简单的解决方案:

class MyView(ListAPIView):
    renderer_classes = (BrowsableAPIRenderer, CSVRenderer)
    pagination_class = StandardPagination
    serializer_class = MySerializer
    ...

并在CSVRenderer检查网址是否包含export=csv,但这会生成CSV格式的纯文本数据,而不是文件。删除BrowsableAPIRenderer会有效,但我仍然需要让端点在没有export=csv的情况下工作。

在调用渲染器之前,有没有办法检查网址?

如果有更好的方法来实现这一点,欢迎提出建议。

编辑:我的渲染器是来自djangorestframework的CSVRenderer:

from rest_framework_csv import renderers as r

class CSVRenderer(r.CSVRenderer):
    pass

Edit2:StandardPagination只是rest_framework.pagination.PageNumberPagination

1 个答案:

答案 0 :(得分:0)

有一个名为djangorestframework-csv的包可能值得一看。我相信它会做你想要实现的目标。它列在CSV rendering section中的Django Rest Framework documentation下。

编辑: 你能否展示一下var bahrein = [ {id: 1, name: "Josef"}, {id: 3, name: "Billy"}, {id: 0, name: "Jane"}, {id: 2, name: "Mack"} ]; bahrein = _.orderBy(bahrein , ['id'],['asc']); 的代码? 您也可以尝试使用GET参数StandardPagination,例如format

编辑: 我已经按照以下方式复制了您的代码,序列化程序和查询集不同,因为我没有你的代码:

http://<domain>/<url to view>/?format=csv

from rest_framework_csv import renderers as r from rest_framework.generics import ListAPIView from rest_framework.renderers import BrowsableAPIRenderer from rest_framework.pagination import PageNumberPagination from .. import Account, AccountSerializer class PageNumberPagination2(PageNumberPagination): page_size = 2 class CSVRenderer(r.CSVRenderer): pass class MyView(ListAPIView): renderer_classes = (BrowsableAPIRenderer, CSVRenderer) pagination_class = PageNumberPagination2 queryset = Account.objects.all() serializer_class = AccountSerializer 我添加了模式urls.py。转到url(r'^test/', MyView.as_view()),时,我会看到可浏览的视图和/test/ CSV文件。

您能否确认这是与您所拥有的内容相同的设​​置,并且您没有在网址周围使用/test/?format=csv