DRF의 핵심 내용 중 하나인 serializer가 무엇인지 알아보고 어떻게 사용해야 되는지 정리해 보았다.
serialization은 "직렬화"라는 뜻이다.
시리얼라이저는 직렬화 시키다. 즉 어떤 데이터를 특정한 포장지를 이용해 감싸주는 도구이다.
시리얼라이저를 사용함으로써 데이터를 정형화 시킬 수 있다. 데이터를 정형화시키게 되면 당연히 통신에도 편하고 데이터 불러오기, 저장 등등에 편리하게 이용할 수 있다.
시리얼라이저는 querysets, db 데이터 인스턴스와 같은 복잡한 데이터들을 파이썬 JSON, XML과 같은 데이터 타입으로 쉽게 변환될 수 있게 해 준다.
아래는 간단한 시리얼라이즈 예시이다.
클래스에 있는 어트리뷰트들을 db에 저장하기 위해, 네트워크를 통해 전달하기 위해 데이터를 정형화시킬 필요가 있기 때문에 다음과 같이 사용해 주는 것이다. 아래 과정을 Serialize라고 하고, 반대의 경우 Deserialize라고 한다.
from rest_framework import serializers
from datetime import datetime
class Comment:
def __init__(self, email, content, created=None):
self.email = email
self.content = content
self.created = created or datetime.now()
comment = Comment(email='leila@example.com', content='foo bar')
class CommentSerializer(serializers.Serializer):
email = serializers.EmailField()
content = serializers.CharField(max_length=200)
created = serializers.DateTimeField()
serializer = CommentSerializer(comment)
serializer.data
# {'email': 'leila@example.com', 'content': 'foo bar', 'created': '2016-01-27T15:17:10.375877'}
파이썬 데이터 타입으로 변형된 데이터들.
최종적으로 데이터를 json 형태로 변경해 주었다.
from rest_framework.renderers import JSONRenderer
json = JSONRenderer().render(serializer.data)
json
# b'{"email":"leila@example.com","content":"foo bar","created":"2016-01-27T15:17:10.375877"}'
Deserialize는 위 과정을 정 반대로 시행하면 된다.
import io
from rest_framework.parsers import JSONParser
stream = io.BytesIO(json)
data = JSONParser().parse(stream)
native 데이터를 검증된 사전 데이터로 변경.
serializer = CommentSerializer(data=data)
serializer.is_valid()
# True
serializer.validated_data
# {'content': 'foo bar', 'email': 'leila@example.com', 'created': datetime.datetime(2012, 08, 22, 16, 20, 09, 822243)}
시리얼라이저를 이용한 db 불러오기, 저장하기.
UserData라는 모델을 생성한 뒤 불러오기.
fields는 해당 모델 중 어떤 레코드 타입(행)을 사용할지 정하는 것이다.
from rest_framework import serializers
from base.models import UserData
class UserDataSerializer(serializers.ModelSerializer):
class Meta:
model = UserData
fields = '__all__'
views.py 에서 데이터를 저장하기 위해 다음과 같이 사용한다.
data는 dict 형태로, 모델에서 정의한 필드를 key로 갖는다.
serializer.save()를 실행하면, 위에 정의한 serializer클래스의 create 함수가 실행된다고 한다.
이렇게 하면 db에 데이터를 성공적으로 저장할 수 있다.
serializer = UserDataSerializer(data=data)
# 데이터가 유효한지 확인한다.
if serializer.is_valid():
serializer.save()
db에 저장된 데이터를 불러올 때
queryset = MilitaryTerm.objects.all()
다음과 같이 작성하면 쉽게 불러올 수 있다.
'장고(DJango)' 카테고리의 다른 글
[Django] render 함수 (render function) (0) | 2022.08.14 |
---|---|
[Django] ORM & migration (0) | 2022.08.14 |
[Django] 장고 settings.py 시크릿키 등 중요정보 ini파일로 관리하기 (0) | 2022.07.31 |
(작성중) 장고 배포 하기 (gunicorn, Nginx) (0) | 2022.07.31 |
(작성중) 장고 mysql (0) | 2022.07.31 |