Django Restful framework Tutorial 2

Serializer 클래스 만들기

직렬화 하고 싶은 필드를 직접 입력 할 수도 있다. Createupdate라는 메소드가 들어 가야 한다. 이 메소드들은 시리얼라이저는 파이썬 객체를 직렬화 할때도 쓰지만 JSON데이터가 들어 왔을때 그 데이터를 이용해 다시 파이썬 객체로 만들때 사용한다. 외부 데이터를 사용해서 장고에 있는 데이터 베이스 내용을 바꾸거나 추가 하고 싶을때도 시리얼라이즈를 사용한다. Create를 이용하여 특정 모델에 받은 데이터를 이용해 생성 해주거나 update를 통하여 특정 인스턴스를 와 받은 데이터를 통하여 해당 인스턴스의 데이터를 수정한다.

class SomeSerializer(serializers.Serializer):
    pk = serializers.IntegerField(read_only=True)
    title = serializes.CharField(required=False, allow_blank=True)
    ...
    
    
    def create(self, validated_data):
        return SomeModel.objects.create(**validated_data)
        
        
    def update(self, instance, validated_Data):
        instance.title = validated_data.get('title', instance.title)
        ...
        instance.save()
        return instance

하지만 배우는 쪽에서는 ` ModelSerializer`를 많이 사용한다.

ModelSerializer

serializer클래스보다 간단하게 모델의 정보를 직렬화 할수 있다. 단순히 Seirializer의 단축 버전이며 필드를 자동으로 인식한다. 그리고 create()메서드와 update()메서드가 이미 구현되어 있다.

class SomeSerializer(serializers.ModelSerializer):
    class Meta:
        model = SomeModel
        fields = ...

SomeSerializer를 사용하는 View만들기

이전에는 request에서 데이터를 다룰때 request.POST로 전달된 데이터를 다루거나 request.GET으로 전달된 데이터를 다뤘는데 rest_framework 에서는 request.data로만 데아터를 다룬다. 이렇게 사용하는것이 훨씬 편하다. 그리거 ResponseHttpResponse를 상속받은 TemplateRespinse 타입이며, 렌더링 되지 않은 콘텐츠를 불러와 클라이언트에게 ㅇ리턴할 콘텐츠 형태로 변환한다.

API뷰 감싸기

REST 프레임워크는 API 뷰를 작성하는데 사용할 수 있는 두가지 래퍼를 제공.

  • @api_view 데코레이터를 함수 기반 뷰에서 사용할 수 있다.
  • APIView 클래스는 클래스 기반 뷰에서 사용 할 수 있다. 우리는 클래스 기반뷰 에서 사용하는 것만 알아 보자.
# views.py
from rest_framework import status
from rest_framework.response import Response
from rest_framework.views import APIView

from .serializers import SomeSerializer
from .models import SomeModel


class SomeList(APIView):
    def get(self, request):
        somemodels = SomeModel.objects.all()
        serializer = SomeSerializer(somemodels, many=True)
        return Response(serializer.data)

    def post(self, request):
        serializer = SomeSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
# urls.py
urlpatterns = [
    path('sonelist/', SomeList.as_view(), name='some-list'),
]

형태는 ModelForm과 비슷하게 생겼다. SomeSerializerform이라고 생각하면 된다.

Comments