[DRF]

DRF Serializer의 필요성과 사용법

Y-Joo 2021. 12. 14. 01:59

필요성

 Django는 models.py를 이용해 db를 만들어 사용한다.

하지만 이를 프론트앤드에 그대로 넘겨줄 수는 없다.

통용될수 있는 데이터 형식인 JSON 혹은 xml로 변환시켜 넘겨줘야 하고,

이를 Serializer가 해줄 수 있는 것이다.

만들면서 하나씩 알아보자.

 

 

models.py 만들기

우선, 간단한 models.py를 만들어보자.

from django.db import models

class Article(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()
    
    class Meta:
        db_table = 'article'

간단한 Article이라는 모델을 만들었다. columns는 제목과 내용으로 구성했다.

편의를 위해 db에 Article 모델이 몇개 저장되어있다는 가정 하에 해보자.

 

 

serializers.py 만들기 

보통 serializers.py를 만들어 여러 serializer들을 한 곳에 보관하고, 꺼내 쓴다.

from rest_framework import serializers
from .models import Article

class ArticleSerializer(serializers.Serializer):
    class Meta:
        model = Article
        fields = ['title', 'content']

models.py에서 방금 만든 Article을 가져와 ArticleSerializer와 연결해주었다.

model은 연결할 모델의 이름을, fields는 해당 모델에서 가져올 column 목록을 써주면 된다.

fields = '__all__'

이렇게 작성하면 모든 필드를 포함하게 할 수 있으나, 권장하지는 않는다

serializer.Serializer은 DRF에서 제공하는 기본 serializer로,

create, update메소드 등이 이미 구현되어 있어 그냥 사용할 수도 있고, 오버라이딩해 사용할 수도 있다.

 

 

views.py 작성

from .serializers import ArticleSerializer
from django.shortcuts import get_list_or_404
from rest_framework.views import APIView
from django.http import JsonResponse
from .models import Article

class ArticleView(APIView):
	def get(self, request):
          queryset = get_list_or_404(Article)
          serializer_class = ArticleSerializer(data=queryset, many=True)
          serializer_class.is_valid()
          return JsonResponse(serializer_class.data, safe=False)

먼저, 모델과 serializer를 가져와준다.

get_list_or_404 메소드는 db에 저장된 해당 모델의 객체 리스트를 리턴하고,

오류가 날 시 404를 리턴한다.

이렇게 가져온 객체 리스트를 queryset이라는 변수에 저장한다.

ArticleSerializer를 새로 만들며 인자로 data와 many를 넘겨준다.

data는 직렬화시킬 데이터를 의미하며, many는 리스트일 경우에 true로 넘겨주고, 

객체가 하나일 시에는 따로 넘겨주지 않아도 된다.

그 후 is_valid() 메소드를 사용해 직렬화된 데이터가 올바른지 검사한다.

이렇게 만든 serializer_class는 JSON형식은 아니다.

serializer_class.data를 넘겨야 JSON 형태로 데이터를 넘길 수 있다.

 

 

save도 해보자

serializer를 사용해 db상에 저장도 할 수 있다.

if (serializer_class.is_valid()):
	serializer_class.save(many=true)

이부분 또한 위와 비슷한 방식으로 가능하다.

추가적으로 many=true는 여러개를 저장할 때 사용할 수 있고,

required=false를 추가하면 모든 필드가 아닌 일부 필드만 저장할 수도 있다.

update메소드를 사용하면 이미 존재하는 db를 수정하는 것도 가능하다.