[DRF] method 요청에 따른 serializer class 사용

Hyeseong·2022년 2월 18일
0

DRF

목록 보기
4/4
from rest_framework import exceptions
from rest_framework import generics

from myapp import models
from myapp import serializers as ser


class MethodSerializerView(object):
    '''
    Utility class for get different serializer class by method.
    For example:
    method_serializer_classes = {
        ('GET', ): MyModelListViewSerializer,
        ('PUT', 'PATCH'): MyModelCreateUpdateSerializer
    }
    '''
    method_serializer_classes = None

    def get_serializer_class(self):
        assert self.method_serializer_classes is not None, (
            'Expected view %s should contain method_serializer_classes '
            'to get right serializer class.' %
            (self.__class__.__name__, )
        )
        for methods, serializer_cls in self.method_serializer_classes.items():
            if self.request.method in methods:
                return serializer_cls

        raise exceptions.MethodNotAllowed(self.request.method)


class UsersListCreateView(MethodSerializerView, generics.ListCreateAPIView):
    '''
    API: /users
    Method: GET/POST
    '''
    queryset = models.User.objects.all()
    method_serializer_classes = {
        ('GET', ): ser.UserListViewSerializer,
        ('POST'): ser.UserCreateUpdateSerializer
    }


class UsersDetailView(MethodSerializerView, generics.RetrieveUpdateAPIView):
    '''
    API: /user/:user_uuid
    Method: GET/PUT/PATCH
    '''
    queryset = models.User.objects.all()
    method_serializer_classes = {
        ('GET', ): ser.UserListViewSerializer,
        ('PUT', 'PATCH'): ser.UserCreateUpdateSerializer
    }
profile
어제보다 오늘 그리고 오늘 보다 내일...

0개의 댓글