from django.db import models from pygments.lexers import get_all_lexers from pygments.styles import get_all_styles
# pygments에서 지원하는 모든 언어 정보를 가져온다. LEXERS = [item for item in get_all_lexers() if item[1]] LANGUAGE_CHOICES = sorted([(item[1][0], item[0]) for item in LEXERS]) # pygments에서 지원하는 모든 코드 스타일들을 가져온다. STYLE_CHOICES = sorted([(item, item) for item in get_all_styles()])
classSnippet(models.Model): created = models.DateTimeField(auto_now_add=True) title = models.CharField(max_length=100, blank=True, default='') code = models.TextField() linenos = models.BooleanField(default=False) language = models.CharField(choices=LANGUAGE_CHOICES, default='python', max_length=100) style = models.CharField(choices=STYLE_CHOICES, default='friendly', max_length=100)
classMeta: ordering = ['created']
모델 구현 후에는 makemigrations, migrate 를 진행해 주자.
Serializer 구현
serializer 는 DRF의 핵심이다. serializer는 파이썬 클래스 인스턴스 형식의 데이터(snippet)를 직렬화하여 JSON 같은 데이터 형식으로 표현해 주거나, 반대로 JSON 같은 데이터 형식의 데이터를 파이썬 클래스 인스턴스 형식의 데이터로 역 직렬화 해주는 역할을 한다.
serializer 의 구현은 django form과 비슷한 면이 있다. 다음의 코드를 보자
다음으로, create(), update() 메소드는 serializer.save() 를 실행할 때 동작할 코드들을 정의해 주는 것이다.
Serialization, Deserialization 테스트
이제 지금까지 구현한 Snippet model과 Serializer를 이용하여 직렬화, 역 직렬화를 테스트 해보자.
Serialization
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
from snippets.models import Snippet from snippets.serializers import SnippetSerializer from rest_framework.renderers import JSONRenderer from rest_framework.parsers import JSONParser
# python 데이터 형태를 JSON으로 변환 content = JSONRenderer().render(serializer.data) content # b'{"id":3,"title":"","code":"print(\\"Hello world!\\")\\n","linenos":false,"language":"python","style":"friendly"}'
# 데이터 스트림을 파이썬 기본 데이터 형으로 변환해 준다. stream = io.BytesIO(content) data = JSONParser().parse(stream) data # {'id': 3, 'title': '', 'code': 'print("Hello world!")\n', 'linenos': False, 'language': 'python', 'style': 'friendly'}