Django REST framework_Serializers

nikevapormax·2022년 9월 19일
0

TIL

목록 보기
100/116
post-custom-banner

공식문서

Serializers

정의

  • queryset이나 model instance 같은 복잡한 타입의 데이터를 native Python datattype으로 변환할 수 있게 해준다.
    • JSON, XML 이나 다른 타입의 콘텐트로 손쉽게 변환할 수 있도록 도와준다.
  • serializer는 위의 직렬화(serialization)와 반대인 역직렬화(deserialization) 또한 제공한다.
    • 파싱된 데이터를 다시 변환해 복잡한 타입의 데이터로 변환해준다.
    • 위의 작업은 유입된 데이터에 대한 validating이 선행된다.
  • REST framework의 serializer는 Django의 Form 또는 ModelForm 클래스와 비슷하게 작동한다.

Serializer 선언

  • 예시로 사용할 간단한 object를 생성한다.
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')
  • 위에서 생성한 Comment object의 직렬화 및 역직렬화에 사용할 serializer를 생성하도록 하자.
from rest_framework import serializers

class CommentSerializer(serializers.Serializer):
    email = serializers.EmailField()
    content = serializers.CharField(max_length=200)
    created = serializers.DateTimeField()

Objects 직렬화

  • 위에서 생성한 CommentSerializer를 통해 comment 또는 comment의 리스드들을 직렬화할 수 있다.
serializer = CommentSerializer(comment)
serializer.data
# {'email': 'leila@example.com', 'content': 'foo bar', 'created': '2022-09-19T15:17:10.375877'}
  • 이 시점에서 model instance를 python native datatype으로 변경한다.
  • 직렬화 프로세스를 종료하기 위해 data를 JSON으로 변경한다.
from rest_framework.renderers import JSONRenderer

json = JSONRenderer().render(serializer.data)
json
# b'{"email":"leila@example.com","content":"foo bar","created":"2022-09-19T15:17:10.375877"}'

Objects 역직렬화

  • 직렬화와 비슷한 프로세스를 가진다. 첫 번째로 stream을 python native datatype으로 파싱한다.
import io
from rest_framework.parsers import JSONParser

stream = io.BytesIO(json)
data = JSONParser().parse(stream)
  • 그 후 파싱된 python native datatype을 딕셔너리 형태의 validated_data로 저장한다.
serializer = CommentSerializer(data=data)
serializer.is_valid()
# True
serializer.validated_data
# {'content': 'foo bar', 'email': 'leila@example.com', 'created': datetime.datetime(2022, 09, 19, 15, 17, 10, 375877)}

instances 저장

  • 만약 validated data를 기반으로 한 완벽한 object instance를 반환하게 하고 싶다면 .create().update() method 둘 다 혹은 하나를 포함해야 한다.
class CommentSerializer(serializers.Serializer):
    email = serializers.EmailField()
    content = serializers.CharField(max_length=200)
    created = serializers.DateTimeField()

    def create(self, validated_data):
        return Comment(**validated_data)

    def update(self, instance, validated_data):
        instance.email = validated_data.get('email', instance.email)
        instance.content = validated_data.get('content', instance.content)
        instance.created = validated_data.get('created', instance.created)
        return instance
profile
https://github.com/nikevapormax
post-custom-banner

0개의 댓글