[drf]airbnb-api -4 serializer

Hyeseong·2021년 3월 24일
0

serializer?

python object <--> JSON object

serializer는 기본적으로 데이터가 보여지는 방식을 json데이터 타입으로 정의하는 역할을 하는 녀석이에요. 모델을 가져가서 가져온 모델들을 검증과 함께 JSON객체로 바꿔주는거조.

모델을 만들었던 것처럼 혹은 장고에서 만드는 form을 만든것 처럼 작성할거에요.

rooms/serializers.py

from rest_framework import serializers


class RoomSerializer(serializers.Serializer):
    name = serializers.CharField(max_length=140)
    price = serializers.IntegerField()
    bedrooms = serializers.IntegerField()
    instant_book = serializers.BooleanField()

전부 정의하지 않은 이유는 밖으로 노출 시키지 않기 위해서에요. 비밀번호 같은경우가 대표적일수 있고 혹은 다른 개인 정보등이나 굳이 자원을 잡아먹어가면서 해당 데이터를 넘기고 싶지 않은 거조.


rooms/views.py

from rest_framework.decorators import api_view
from rest_framework.response import Response
from .models import Room
from .serializers import RoomSerializer


@api_view(["GET"])
def list_rooms(request):
    rooms = Room.objects.all() # 쿼리셋을 불러 올게요. 
    serialized_rooms = RoomSerializer(rooms, many=True) # 시리얼라이저는 한 개 item에 대해 인식가능하지 queryset으로 넘어간 collection은 인식하지 못하기 때문에 many=True옵션을 설정해주어야해요. 
    return Response(data=serialized_rooms.data) # 

다시 말해서 RoomSerializer()를 통해서 파이썬 객체를 JSON객체로 변환시킨거에요. 물론 JSON데이터를 다시 Python객체로 deserializer할 수도 있어요.


ModelSerializer

여기서 더 응용해 볼게요.

귀찮음은 어찌보면 개발자에게는 있어서는 안되는 덕목이지만 더 짧고 편하게 할 수 있는 소스 코드는 없을까? 라는 생각과 견주어 본다면 코드리팩토링에 있어서 다른 시리얼라이저를 상속 받아 사용하면 멋집니다.

기존 작성한 룸시리얼라이저를 아래 ModelSerializer를 이용하면 더 아름답고 간결하게 작성할 수 있어요.
심지어 TinyUserSerializer를 통해서 시리얼라이저를 중첩해서 표현했어요.

from rest_framework import serializers
from users.serializers import TinyUserSerializer
from .models import Room

class RoomSerializer(serializers.ModelSerializer):

    user = TinyUserSerializer()

    class Meta:
        model = Room
        fields = ("name", "price", "instant_book", "user")

users/serializers.py

from rest_framework import serializers
from .models import User


class TinyUserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ("username", "superhost")
profile
어제보다 오늘 그리고 오늘 보다 내일...

0개의 댓글