django-rest-frameworkのserializerってどう呼ばれてるんだろう


目的

  • 前に書いたやつ でserializerの中身は読んだ
  • でもこのserializerってどこでどう呼ばれてるんだろう

環境

  • 前のと同じ
  • Serializerの使い方とかは参考記事を参照

結論

  • mixins.pyで呼ばれてた
    • createupdateのそれぞれで
class CreateModelMixin(object):
    """
    Create a model instance.
    """
    def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        self.perform_create(serializer)
        headers = self.get_success_headers(serializer.data)
        return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
class UpdateModelMixin(object):
    """
    Update a model instance.
    """
    def update(self, request, *args, **kwargs):
        partial = kwargs.pop('partial', False)
        instance = self.get_object()
        serializer = self.get_serializer(instance, data=request.data, partial=partial)
        serializer.is_valid(raise_exception=True)
        self.perform_update(serializer)
  • get_serializerしてis_validしてperform_hogehogeするっていう流れらしい
    • perform_hogehogeではserializer.save()してる

応用

  • POSTとかPUTでAPIを呼ばれた時の挙動を帰るときはviewのcreateメソッドとかupdateメソッドを上書きしてやればよさげ
  • DBにデータ書き込みはしないけどPOSTでAPIを提供したいときは↓みたいな感じ?
    def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        # ここでserializer.validated_dataを使って何らかの処理をする
        return Response({'result': 'data'}, status=status.HTTP_200_OK)

参考