目标:
让每个端点在参数中使用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
答案 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
?