프로그래밍

[DRF] Serialize(직렬화) 본문

Python/Django REST Framework

[DRF] Serialize(직렬화)

시케 2023. 11. 28. 15:04
728x90
반응형

2023.11.28.화

Serialize(직렬화)

Django REST Framework가 제공하는 핵심 기능중에 하나이다

장고는 ORM을 지원하기 때문에 데이터베이스의 데이터가 파이썬의 객체로써 존재한다

 

이 Python 객체는 웹 요청 및 응답에 알맞는 데이터 형식이 아니기 때문에

해당 데이터 형식으로 변환해주어야 한다

이때 변환해주는 과정이 Serialize, 직렬화이다

 

DRF에서는 이러한 직렬화를 위해 serializers 모듈을 제공한다

이 모듈을 사용하여 모델 인스턴스나 쿼리셋과 같은 복잡한 데이터를 JSON 또는 다른 형식으로 변환하고

반대로 웹 요청에서 받은 데이터를 다시 파이썬 객체로 변환할 수 있다

직렬화 방식

기본적으로는 serializers.ModelSerializer를 사용하는 방식이 있지만

serializers.Serializer를 상속 받아 직접 커스텀하여 직렬화 할 수도 있다

 

이 밖에도 DRF가 지원하는 출력형식으로 지정할 수 도 있으며

# settings.py
REST_FRAMEWORK = {
    'DEFAULT_RENDERER_CLASSES': (
        'rest_framework.renderers.JSONRenderer',
        'rest_framework.renderers.XMLRenderer',
        'rest_framework.renderers.YAMLRenderer',
    ),
}

 

응답 객체를 사용할 수도 있다

from rest_framework.response import Response
from rest_framework import status

def my_view(request):
    data = {'key': 'value'}
    return Response(data, status=status.HTTP_200_OK)

DRF의 Response 클래스는 데이터를 자동으로 직렬화하여 응답을 생성한다

Response 객체를 사용하면 데이터와 함께 상태 코드 및 다양한 응답 헤더를 간편하게 설정할 수 있다

 

쿼리 매개변수를 사용하여 응답형식을 지정할 수도 있다

http://example.com/api/my_endpoint/?format=json # json형식으로 지정

 

예시 코드

가장 기본적인 방식인 serializers.ModelSerializer를 사용하여 구현하였다

 

models.py

# models.py
from django.db import models

class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.CharField(max_length=50)
    published_date = models.DateField()

 

serializers.py

# serializers.py
from rest_framework import serializers
from .models import Book

class BookSerializer(serializers.ModelSerializer):
    class Meta:
        model = Book
        fields = ['id', 'title', 'author', 'published_date']

 

직렬화를 위해 작성된 클래스이며 주로 app 하위에 존재한다

해당 모델을 JSON 형식으로 변환하거나 반대로 JSON 데이터를 모델 객체로 변환할 수 있다

 

views.py

# views.py
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from .models import Book
from .serializers import BookSerializer

class BookList(APIView):
    def get(self, request):
        books = Book.objects.all()
        serializer = BookSerializer(books, many=True)
        return Response(serializer.data)

    def post(self, request):
        serializer = BookSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

 

위의 직렬화 클래스를 views.py 로직에서 활용하는 예제 코드이다

 

API 뷰는 GET 요청에 대해 모든 책을 반환하고, POST 요청에 대해 새로운 책을 생성한다

직렬화 클래스를 사용하면 데이터 유효성 검사 및 변환을 쉽게 구현할 수 있다

728x90
반응형

'Python > Django REST Framework' 카테고리의 다른 글

[DRF] status  (0) 2023.11.29
[DRF] Response  (0) 2023.11.29
[DRF] APIView와 api_view  (1) 2023.11.29
[DRF] 페이지네이션(Pagination)  (2) 2023.11.28
[DRF] Django REST Framework  (0) 2023.11.28
Comments