Serializer의 역할

Serializer는 Django REST Framework의 기능으로, API 통신을 할 때 정해진 포맷(JSON)을 사용하기 때문에

내가 만든 모델의 쿼리셋, 즉 Model 인스턴스를 JSON형태로 바꾸어주는 역할을 한다.

# models.py

class Addresses(models.Model):
    name = models.CharField(max_length=10)
    phone_number = models.CharField(max_length=13)
    address = models.TextField()

위와 같이 유저의 주소록 정보가 담긴 모델이 있다고 하자.

몇 가지 데이터를 넣고 장고 Shell에서 확인해보자.

>>> from addresses.models import Addresses
>>> Addresses.objects.all()
<QuerySet [<Addresses: 혜인>, <Addresses: 시리얼라이저>]>

이처럼 쿼리셋 형태로 나오는걸 볼 수 있다.
하지만 우리는 이를 JSON으로 변환해야한다

Serializer 생성

# serializers.py

from rest_framework import serializers
from .models import Addresses

class AddressesSerializers(serializers.ModelSerializer):
    class Meta:
        model = Addresses # 모델 연결
        fields = "__all__" # 모든 field의 값을 직렬화

앱 내에 serializers.py 파일을 생성한 뒤, AddressesSerializers라는 serializer를 정의했다.

코드 설명

models = Addresses는 해당 serializer에 모델을 연결하는 것이다.

이처럼 serializer를 정의하고 Model 객체를 넣었을때에 serializer.data 내부에 해당 Model을 serialize한 데이터가 담기게 된다.

fields = "__all__"은 Addresses모델 인스턴스에서 모든 필드의 값을 직렬화하는 코드이다.
이 때, 필드의 모든 값을 직렬화 하지 않고 몇개의 필드만 응답할 수도 있다.

id와 name만 응답하려면 아래처럼 작성한다.

class Meta:
        model = Addresses
        fields = ('id', 'name')

반대로 제외할 필드를 설정할 수도 있다.

class Meta:
        model = Addresses
        exclude = ('id', 'name')

위와 같이 작성한다면 id와 email을 제외한 모든 값이 직렬화된다.

Serializer - View 연결

이제 요청에 따른 응답을 보내보자.

# views.py

@api_view(['GET'])
def address(req, id):
    obj = Addresses.objects.get(id=id) # 요청 온 id 값에 해당하는 데이터 추출
    serializer = AddressesSerializers(obj) # serializer 변환
    return JsonResponse(serializer.data, safe=False) # JSON 응답

클라이언트에서 id 값과 함께 요청이 오면 그 id 값에 해당하는 데이터를 응답하는 코드다.

요청 받은 id값에 해당하는 데이터를 찾아 obj 변수에 넣은 뒤, serializer변수를 선언하여 위에서 만든 AddressesSerializers에 넘겨 데이터를 변환시켜주고 변환된 데이터를 JSON 형태로 응답시켜준다.

응답 값 확인

image

웹에서 해당 view에 연결된 url로 GET 요청을 보냈더니 JSON 형태로 응답이 오게된다.
id값과 email값은 아까 Serializer를 정의할때 exclude했으므로 제외된 모습도 볼 수 있다!

Serializer VS ModelSerializer

일반적인 Serializer는 필드를 하나하나 다 써줘야하며 create와 update하는 과정을 거쳐야한다.

하지만 ModelSerializer는 모델을 연결하면 해당 필드를 자동으로 인식하기에 따로 작성 할 필요가 없으며 create, update 메소드를 내장하고 있어서 코드 길이를 매우 짧게 작성할 수 있다.

# models.py

class Addresses(models.Model):
    name = models.CharField(max_length=10)
    phone_number = models.CharField(max_length=13)
    address = models.TextField()