반응형
[DRF] Serializers - Serializers 선언하기
원문 의 내용 중 해석이 애매한 부분은 그대로 표기하였고, 복잡한 문장은 의역하여서 정리하였습니다
간단한 객체를 생성해보자.
x
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')
우리는 아래에 serializer를 선언할 것인데, 직렬화, 역직렬화 할 수있고 이 데이터는 Comment
objects와 일치한다.
serializer를 선언하는 것은 form을 선언하는 것과 매우 비슷하다.
x
from rest_framework import serializers
class CommentSerializer(serializers.Serializer):
email = serializers.EmailField()
content = serializers.CharField(max_length=200)
created = serializers.DateTimeField()
내 마음대로 해설
예제에서는 serializers.Serializer 를 이용하여서, Serializer class를 선언하였다. 대개의 패턴을 보았을 때, 장고 모델이 사용될 때는 ModelSerializer를 사용하는 것이 생산성의 측면에서 훨씬 더 나은 것 같았고, 장고 모델을 쓰지 않는 경우에는 Serializer class를 대개 사용하는 것 같았다.
comment 인스턴스를 흔한 방법으로 직렬화 해보면, 아래와 같다 인스턴스의 각 속성에 직접 접근하여서, dict를 생성한다.
xxxxxxxxxx
In [37]: serializer_data = {'email': comment.email, 'content': comment.content, '
...: created': comment.created.strftime('%Y-%m-%dT%H:%m:%S.%fZ')}
In [38]: serializer_data
Out[38]:
{'email': 'leila@example.com',
'content': 'foo bar',
'created': '2021-01-30T17:01:56.638989Z'}
Seirializer 클래스를 이용하면, 아래와 같은 스텝으로 변환이 된다.
x
In [16]: serializer = CommentSerializer(comment)
In [17]: serializer.data
Out[17]: {'email': 'leila@example.com', 'content': 'foo bar', 'created': '2021-01-30T17:50:56.638989Z'}
아직 봐야할 부분이 많이 남았지만, 일단 윗부분만 보았을 때는, serializer가 존재하는 이유는 직렬화하는 부분에서 사람의 손을 최대한 덜 타고 미리 정의해놓은 serializer 클래스를 통해서 해결하기 위함이라고 생각되어진다.
결론
- 폼 클래스 생성하는 것과 매우 비슷한 serializer 클래스 생성은 직렬화를 손쉽게 하기위하여서 사용한다.
- Serializer는 모델을 사용하지 않을 때 사용된다. 모델을 사용하여서 직렬화를 할 때는 ModelSerializer를 사용하자.
문제
xxxxxxxxxx
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 클래스가 주어졌을 때, 아래 serializer class를 정의하고 실제 comment 인스턴스를 생성하여서 직접 직렬화하여 결과값을 출력하여라.
x
from rest_framework import serializers
class CommentSerializer(serializers.Serializer):
pass
xxxxxxxxxx
self.assertEqual(
serializer.data,
{
"email": "leila@example.com",
"content": "foo bar",
"created": "2021-01-30T17:50:56.638989Z",
},
)
반응형
'개발 > 장고' 카테고리의 다른 글
[DRF] Serializers - 객체 역직렬화 하기 (0) | 2021.01.31 |
---|---|
[DRF] Serializers - 객체 직렬화 하기 (0) | 2021.01.31 |
[DRF] Serializers - 개요 (0) | 2021.01.31 |
[해설과 함께 읽는 Django 문서] Models - 다대다 관계에서의 추가 필드 (0) | 2021.01.30 |
[Django] 다대다 관계에서 through, through_fields, through_defaults (1) | 2021.01.30 |