【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を返却するようにします。
以下にlist
とretrieve
で返却するフィールドを変えたserializers.py
とviews.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を設定することができます。
今回はlist
とretrieve
の例でしたが、他のアクションも同様にして、serializerを分けることが可能です。
参考
Generic views - Django REST framework
Django rest framework, use different serializers in the same ModelViewSet-open source projects tomchristie/django-rest-framework
Google グループ