안녕하세요 !!!
최근에 장고로 API만들기를 공부하고 있습니다 !!
그래서 사용하다 보면서 좋은게 있거나 여러분들도 알았으면 하는 것들을 소개하려고 합니다 !
이번에는 django rest framework에서 ModelSerializer와 Serializer의 차이점에 대해서 알아볼것입니다 !!! 엄청납니다 !
Serializer이란?
먼저 rest framework Serializer을 알아보겠습니다 !
장고에서는 파이선 데이터를 보통 queryset으로서 가지고 오는데요 !!! 이 때 ! 이 데이터는 print를 이용해서 볼 수 있지만 유저가 볼 수는 없습니다 ! 왜냐하면 이것들을 view해주는곳으로 념겨줘서 받은곳에서는 이 데이터를 뿌려야하는데 브라우저에서는 queryset으로 받아온 데이터를 읽지 못하기 때문입니다 !
그래서 Serializer을 이용합니다 ! 이것은 브라우저가 파이선 코드를 읽을 수 있게 손쉽게 JSON형태로 변환을 시켜줍니다 ! 여기서 ! 반대로 유저들이 데이터를 업데이트 하거나 생성을 할 때 브라우저에서 파이선 코드로 변환시켜주기도 합니다 !!! 장고는 똑똑하니까요 !
그럼 한번 Serializer을 이용해서 한번 코드를 짜볼까요?
아래와 같이 됩니다 !
class CategorySerializer(serializers.Serializer):
pk = serializers.IntegerField(read_only=True)
name = serializers.CharField(
required=True,
max_length=50
)
kind = serializers.ChoiceField(
choices=Category.CategoryKindChoices.choices,
)
created_at = serializers.DateTimeField(read_only=True)
def create(self, validated_data):
return Category.objects.create(
**validated_data
)
def update(self, instance, validated_data):
instance.name = validated_data.get("name", instance.name)
instance.kind = validated_data.get("kind", instance.kind)
instance.save()
return instance
위에서는 저희가 보여줘야 할 데이터도 정의를 해야하고 validation도 해줘야 하고 .....
즉 ! 밑에와 같이 불편함이 있습니다 !
모델에서 정의 한 것을 다시 써줘야하는 불편함
validation도 다시 해줘야함
지금은 보여주고 싶은 데이터가2개뿐 ! 하지만 10개, 20개....그 이상 있다면? 일일이 써줘야....
또한 create, update를 해줘야하죠 !
그래서 !!!
이 불편함을 없애기 위해서 ModelSerializer를 사용해서 마법을 부릴 수 있습니다 !
ModelSerializer란
ModelSerializer는 다음을 제외하고는 일반적인 Serializer입니다.
기본 field가 자동으로 채워집니다.
기본 validation이 자동으로 채워집니다.
기본 .create() 및 .update() 구현이 제공됩니다.
모델 필드를 기반으로 일련의 Serializer 필드를 자동으로 결정하는 프로세스는 상당히 복잡하지만 구현을 파헤칠 필요는 거의 없습니다.
설명은 위와 같습니다 ! 간단하죠?? 설명그대로입니다 !!
그럼 바로 소스코드로 확인을 해보겠습니다 !
class CategorySerializer(serializers.ModelSerializer):
class Meta:
model = Category
fields = "__all__"
#fields = ("name", "kind")
#exclude = ("id",)
위에처럼 하면 끝입니다 !!!! 엄청 쉽죠???
코드에서 볼 수 있듯이 저희에겐 2가지 선택권이 있습니다.
1. 보여줄 fields을 설정
2. exclude를 설정해서 보여주고 싶지 않는 fields를 설정
결과는 밑과 같습니다 !
또한 ModelSerializer을 Print해보면 밑에와 같이 나옵니당
자 그러면 !
코드 비교를 해봅시다 !!!
완벽한 마법이군요 !!!! 단 3~5줄안에 끝나다니 !!
정리
Serializer와 ModelSerializer에 대해서 배워봤습니다
ModelSerializer에 대해서 정말 엄청나다는것을 알게 됐는데요 !!
하지만 ModelSerializer이것만 배우고 나면 정확히 내부에서 어떤식으로 create, update, 필드설정같은게 어떻게 표현 됐는지 모르죠 ! 그래서 Serializer에 대해서도 알아봤습니다 !!!
실무에서는 ModelSerializer 이것을 많이 쓴다고 합니다 !!!
하지만 저는 내부적으로도 어떻게 돌아가면 좋을지 알고 싶었습니다 >_<