📌 이 포스팅에서는 DRF의 직렬화(Serialization)와 역직렬화(Desearialization)의 개념에 대해 알아보고, Serializer를 사용하는 방법에 대해 정리하였습니다.
🔥 직렬화(Serialization) 란?
🔥 Serializer 사용법
🔥 ListCreateAPIView 사용법
✔️ 모든 통신에서 데이터는 반드시 문자열 또는 바이트로 표현되어야만 한다.
✔️ 객체를 문자열 또는 바이트로 변환하여 데이터를 전송하는 과정을 직렬화(Serialization)라고 하고, 이 반대로 수신한 바이트를 다시 객체로 변환(메모리 상의 복원)하여 활용하는 것을 역직렬화(Desearialization)라한다.
✔️ 직렬화된 바이트들은 외부 장치에 저장하거나 다른 시스템으로 전송할 수 있으며, 파이썬을 사용하는 다른 시스템은 (OS와 같은 플랫폼 환경에 상관없이) 다시 이를 파이썬 객체로 역직렬화할 수 있다.
✔️ Serializer와 ModelSerializer는 Django의 Form과 ModelForm와 유사하다.
# forms.py(ModelForm 사용시) from django.forms import ModelForm from .models import Post class PostForm(ModelForm): class Meta: model = Post fields = '__all__'
# serializers.py(ModelSerializer 사용 시) from rest_framework.serializers import ModelSerializer from .models import Post class PostSerializer(ModelSerializer): class Meta: model = Post fields = '__all__'
✔️ 서로의 공통점으로는 필드 지정 및 모델로부터 읽어올 수 있고, 입력된 데이터에 대한 유효성 검사를 진행한다.
✔️ 차이점으로는 Form과 ModelForm는 form 태그가 포함된 HTML을 생성하지만, Serializer와 ModelSerializer는 form 데이터가 포함된 JSON 타입의 문자열을 생성한다.
✔️ Django Shell에 진입해, serializers.py에 만든 PostSerializer와 Model의 Post를 import 한다.
✔️ 참고로, Serailzer를 만들 때, Class명은 Model명+Serializer를 사용한다.
✔️ PostSerializer에 1개의 query를 넣고, .data로 확인하면 JSON형태로 변환된 것을 볼 수 있다.
In [1]: from instagram.serializers import PostSerializer In [2]: from instagram.models import Post In [3]: qs = Post.objects.first() In [4]: qs Out[4]: <Post: Post object (1)> # 👈 qs는 Query이다. In [5]: serializer = PostSerializer(qs) In [6]: serializer.data # 👈 .data를 통해 JSON형식으로 변환시킬 수 있다. Out[6]: {'id': 1, 'created_at': '2022-01-31T11:27:42.449239Z', 'updated_at': '2022-01-31T11:27:42.449283Z', 'message': '1st Test Message Using DRF.'}
✔️ 다수의 Queryset을 넘길 때는 many=True 옵션을 사용한다.
In [1]: from instagram.serializers import PostSerializer In [2]: from instagram.models import Post In [3]: qs = Post.objects.all() In [4]: qs Out[4]: <QuerySet [<Post: Post object (1)>, <Post: Post object (2)>, <Post: Post object (3)>, <Post: Post object (4)>]> In [5]: serializer = PostSerializer(qs, many=True) # 👈 many=True In [6]: serializer.data Out[6]: [OrderedDict([('id', 1), ('created_at', '2022-01-31T11:27:42.449239Z'), ('updated_at', '2022-01-31T11:27:42.449283Z'), ('message', '1st Test Message Using DRF.')]), OrderedDict([('id', 2), ('created_at', '2022-01-31T11:33:06.922178Z'), ('updated_at', '2022-01-31T11:33:06.922206Z'), ('message', '2nd Test Message Using Httpie')]), OrderedDict([('id', 3), ('created_at', '2022-01-31T11:41:41.053855Z'), ('updated_at', '2022-01-31T11:42:17.488317Z'), ('message', 'Hello DRF')]), OrderedDict([('id', 4), ('created_at', '2022-01-31T12:09:30.804280Z'), ('updated_at', '2022-01-31T12:11:46.696129Z'), ('message', 'I just modified the 4th message.')])]
✔️ ListCreateAPIView를 상속받으면, 게시물 리스트를 GET하거나, 게시글을 생성할 수 잇는 View를 간단히 만들 수 있다.
✔️ ListCreateAPIView는 "from rest_framework import generics"를 import하여 사용한다.
✔️ 간단하게, queryset과 serializer_class만 지정함으로써 구현이 가능하다.
from django.shortcuts import render from rest_framework import generics # 👈 generics import from rest_framework.viewsets import ModelViewSet from .serializers import PostSerializer from .models import Post class PublicPostListAPIView(generics.ListCreateAPIView): # 👈 추가 queryset = Post.objects.all() serializer_class = PostSerializer
✔️ model에 auth를 참조하여 Post에 대한 사용자를 아래 처럼 지정하였을 때, author가 아닌 username으로 나타나게 하고 싶을 때가 있다.
# models.py from django.conf import settings from django.db import models class Post(models.Model): author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) # 👈 추가 message = models.TextField() created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True)
✔️ ReadOnlyField를 사용하여 author을 username으로 변환하여 사용할 수 있다.
# serializers.py from rest_framework import serializers from .models import Post # PostSerializer class PostSerializer(serializers.ModelSerializer): username = serializers.ReadOnlyField(source='author.username') # 👈 ReadOnlyField 사용 class Meta: model = Post fields = [ 'pk', 'username', 'message', 'created_at', 'updated_at', ]