【Python・Django】Django REST frameworkで同一URLでrenderer_classesを動的に変更する方法

【Python・Django】Django REST frameworkで同一URLでrenderer_classesを動的に変更する方法


# django # python

環境

Django1.1 Django REST framework3.5

やりたかったこと

Django REST frameworkを使っている中で、GETリクエストの場合はjsonを返却し、postリクエストの場合はcsvを返却するという処理を実装したかった。

renderer_classesの変更方法

内部で使用されている、get_renderersをオーバーライドしてあげればokです。 本来の処理はrenderer_classesに記載されているclassをインスタンス化して返す処理となっています。 そのため、オーバーライドした処理の中でもきちんとインスタンス化したものを返却してあげる必要があります。

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のライブラリはこういうオーバーライドで拡張性持たせているものが多くて助かります。読みやすいし。