당신은 멋쟁이, 우리는 장고쟁이~

0%

DRF Tutorial 4편 - Serializer로 작업하기

Serializer 로 작업하기


Working with Serializers (serializer 로 작업하기)


더 진행 하기 전에, Serializer 클래스를 사용하는데에 친숙해져야 합니다. 연습을 하기 위해서, 아래 명령어를 실행하여 Django shell 에 접속해 봅니다.


1
python manage.py shell

인스턴스 생성


몇가지 모듈을 불러와 놓고, 우리가 사용해볼 몇가지 코드 snippet 을 생성해 봅시다.


1
2
3
4
5
6
7
8
9
10
from snippets.models import Snippet 
from snippets.serializers import SnippetSerializer
from rest_framework.renderers import JSONRenderer
from rest_framework.parsers import JSONParser

snippet = Snippet(code='foo = "bar"\n')
snippet.save()

snippet = Snippet(code='print("hello, world")\n')
snippet.save()

이제 우리는 가지고 놀수 있는 몇가지 snippet 인스턴스들을 가지고 있습니다. 이 인스턴스중 하나를 serializing 하는것을 둘러봅니다


인스턴스 serializing


1
2
3
4
5
6
7
# serializers.py 에 작성된 SnippetSerializer 클래스를 불러오고 
# snippet 인스턴스를 인자로 넣어준다.

In [11]: serializer = SnippetSerializer(snippet)

In [12]: serializer.data
Out[12]: {'id': 2, 'title': '', 'code': 'print("hello, world")\n', 'linenos': False, 'language': 'python', 'style': 'friendly'}

여기서 우리는, 모델 인스턴스를 Python 의 기본 데이터 유형으로 전환하였습니다.


serialization (직렬화) 프로세스를 끝내기 위해서, 데이터를 json 으로 렌더해줍니다


1
2
3
4
In [13]: content = JSONRenderer().render(serializer.data)                                                                                                                 

In [14]: content
Out[14]: b'{"id":2,"title":"","code":"print(\\"hello, world\\")\\n","linenos":false,"language":"python","style":"friendly"}'

Deserializing 하기


deserialization 도 비슷합니다. json 으로 렌더되었던 content 를, BytesIO 로 전환한후에 stream 에 담아줍니다. 이 stream 을 parse 하여, Python 기본 데이터 유형으로 바꿔줍니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
In [15]: import io                                                                                                                                                        

In [16]: stream = io.BytesIO(content)

In [17]: data = JSONParser().parse(stream)

In [18]: data
Out[18]:
{'id': 2,
'title': '',
'code': 'print("hello, world")\n',
'linenos': False,
'language': 'python',
'style': 'friendly'}

그리고 난 후에, 파이썬 기본 데이터 유형을 완벽하게 채워진 객체 인스턴스로 복원 합니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
In [19]: serializer = SnippetSerializer(data=data)                                                                                                                        

In [20]: serializer.is_valid()
Out[20]: True

In [21]: serializer.validated_data
Out[21]:
OrderedDict([('title', ''),
('code', 'print("hello, world")'),
('linenos', False),
('language', 'python'),
('style', 'friendly')])

In [22]: serializer.save()
Out[22]: <Snippet: Snippet object (3)>

Django 에서 form class 와 form 인스턴스를 가지고 작업하는것과,

비슷한 점이 많다는것을 눈치 채야 합니다.


공통된 부분은, serializer 를 사용하는 views 를 작성할때 더욱 명확해 질것 입니다.


또한, 모델 인스턴스들 대신에, 쿼리셋들도 직렬화 할수 있습니다. 그렇게 하기 위해서는, 간단하게 many=true 플래그를, serializer 인자에 넣어줍니다.


1
2
3
4
5
In [23]: serializer = SnippetSerializer(Snippet.objects.all(), many=True)                                                                                                 

In [24]: serializer.data
Out[24]: [OrderedDict([('id', 1), ('title', ''), ('code', 'foo = "bar"\n'), ('linenos', False), ('language', 'python'), ('style', 'friendly')]), OrderedDict([('id', 2), ('title', ''), ('code', 'print("hello, world")\n'), ('linenos', False), ('language', 'python'), ('style', 'friendly')]), OrderedDict([('id', 3), ('title', ''), ('code', 'print("hello, world")'), ('linenos', False), ('language', 'python'), ('style', 'friendly')])]