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 형태로 응답시켜준다.
응답 값 확인
웹에서 해당 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()