TIL118. DRF : Serializer & ModelSerializer 간단 사용기

ID짱재·2022년 2월 9일
1

Django REST Framework

목록 보기
2/10
post-thumbnail

📌 이 포스팅에서는 DRF의 직렬화(Serialization)와 역직렬화(Desearialization)의 개념에 대해 알아보고, Serializer를 사용하는 방법에 대해 정리하였습니다.



🌈 Serializer & ModelSerializer 간단 사용기

🔥 직렬화(Serialization) 란?

🔥 Serializer 사용법

🔥 ListCreateAPIView 사용법



1. 직렬화(Serialization) 란?

🤔 직렬화란 무엇일까?

✔️ 모든 통신에서 데이터는 반드시 문자열 또는 바이트로 표현되어야만 한다.

✔️ 객체를 문자열 또는 바이트로 변환하여 데이터를 전송하는 과정을 직렬화(Serialization)라고 하고, 이 반대로 수신한 바이트를 다시 객체로 변환(메모리 상의 복원)하여 활용하는 것을 역직렬화(Desearialization)라한다.

✔️ 직렬화된 바이트들은 외부 장치에 저장하거나 다른 시스템으로 전송할 수 있으며, 파이썬을 사용하는 다른 시스템은 (OS와 같은 플랫폼 환경에 상관없이) 다시 이를 파이썬 객체로 역직렬화할 수 있다.

🤔 Serializer & ModelSerializer

✔️ 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 타입의 문자열을 생성한다.



2. Serializer 사용법

🤔 1개의 Object를 넘길 때,,

✔️ 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을 넘길 때,

✔️ 다수의 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.')])]


3. ListCreateAPIView 사용법

🤔 post list에 대한 View 생성

✔️ 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

🤔 field명 custom 하기

✔️ 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',
        ]
profile
Keep Going, Keep Coding!

0개의 댓글