環境
Django1.1
Django REST framework3.5
やりたかったこと
Django REST frameworkを使っている中で、GETリクエストの場合はjsonを返却し、postリクエストの場合はcsvを返却するという処理を実装したかった。
renderer_classesの変更方法
内部で使用されている、get_renderersをオーバーライドしてあげればokです。
本来の処理はrenderer_classesに記載されているclassをインスタンス化して返す処理となっています。
そのため、オーバーライドした処理の中でもきちんとインスタンス化したものを返却してあげる必要があります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
from djangorestframework_camel_case.render import CamelCaseJSONRenderer from rest_framework_csv.renderers import CSVRenderer from rest_framework.response import Response class DataCollectionsDownloadsView(BaseView): renderer_classes = () def get_renderers(self): if self.request.method == 'POST': return [CSVRenderer()] elif self.request.method == 'GET': return [CamelCaseJSONRenderer()] def get(self, request, format=None): foo = 'something' return foo def post(self, request, format=None): rcontext = super().get_renderer_context() context['header'] = ( self.request.GET['fields'].split(',') if 'fields' in self.request.GET else None) return context |
公式にはここらへんの記載はありませんでしたが、Pythonのライブラリはこういうオーバーライドで拡張性持たせているものが多くて助かります。読みやすいし。