Serializer 로 작업하기
Working with Serializers (serializer 로 작업하기)
더 진행 하기 전에, Serializer 클래스를 사용하는데에 친숙해져야 합니다. 연습을 하기 위해서, 아래 명령어를 실행하여 Django 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')])]