読者です 読者をやめる 読者になる 読者になる

【Django REST framework】viewの中で使用するserializerを変更する

ModelViewSetなんかを使用していると、それぞれのアクション毎にserializerを変更したいことが多々あると思います。
日本語情報が少なくてベストプラクティスなのかどうかは疑わしいですが、クラスベースviewの中でserializerを変更する方法をとりあえずメモしておきます。

環境

Python 3.5.2
Django 1.9.7
djangorestframework 3.4.0

方法

get_serializer_classメソッドをオーバーライドし、アクション毎に異なるserializerを返却するようにします。
以下にlistretrieveで返却するフィールドを変えたserializers.pyviews.pyの簡単なコード例を示します。

serializers.py

class HogeSerializer(serializers.ModelSerializer):
    class Meta:
        model = Hoge
        fields = ('id', 'name')


class HogeRetrieveSerializer(serializers.ModelSerializer):
    class Meta:
        model = Hoge
        fields = '__all__'

views.py

from .serializers import HogeSerializer, HogeRetrieveSerializer

class HogeView(viewsets.ModelViewSet):
    queryset = Hoge.objects.all()

    def get_serializer_class(self):
        if self.action == 'retrieve':
            return HogeRetrieveSerializer
        return HogeSerializer

上記の例ですと、listの時はidとnameカラムのみが返却され、retrieveの時には、モデルの全てのフィールドが返却されます。
このように、get_serializer_classメソッドをオーバーライドすることで、アクションに応じたserializerを設定することができます。
今回はlistretrieveの例でしたが、他のアクションも同様にして、serializerを分けることが可能です。

参考

Generic views - Django REST framework
Django rest framework, use different serializers in the same ModelViewSet-open source projects tomchristie/django-rest-framework
Google グループ