본문 바로가기
IT관련/Python

[Django] ModelSerializer vs Serializer의 차이점과 사용법에 대해서 알아봅시다 !

728x90

안녕하세요 !!! 

최근에 장고로 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 이것을 많이 쓴다고 합니다 !!!

하지만 저는 내부적으로도 어떻게 돌아가면 좋을지 알고 싶었습니다 >_< 

728x90