Serializer

유정원·2024년 8월 30일

python

목록 보기
8/21

Django REST Framework(DRF)에서 Serializer는 Django 모델 인스턴스나 쿼리셋과 같은 복잡한 데이터 타입을 JSON, XML 등의 네이티브 데이터 타입으로 변환하는 데 사용됩니다. 반대로, 클라이언트로부터 받은 JSON 데이터를 Django의 데이터 타입으로 변환해 데이터베이스에 저장하기 위해 검증하고, 역직렬화(deserialization)하는 역할도 합니다.

주요 기능

  1. 직렬화 (Serialization): 모델 인스턴스나 기타 복잡한 데이터를 JSON 등으로 변환하여 API 응답으로 전송할 수 있게 합니다.
  2. 역직렬화 (Deserialization): 클라이언트로부터 받은 데이터를 Python 객체로 변환하여 데이터베이스에 저장하거나 비즈니스 로직에 사용할 수 있도록 합니다.
  3. 데이터 검증: 클라이언트로부터 받은 데이터를 다양한 필드 수준에서 검증할 수 있습니다. 예를 들어, 필수 필드 체크, 데이터 타입 검증 등을 수행합니다.

기본 예시

아래는 기본적인 시리얼라이저 사용 예시입니다.

모델 정의

from django.db import models

class MyModel(models.Model):
    name = models.CharField(max_length=100)
    age = models.IntegerField()

시리얼라이저 정의

from rest_framework import serializers
from myapp.models import MyModel

class MyModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = MyModel
        fields = ['id', 'name', 'age']

사용 예시

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status

class MyModelListCreateAPIView(APIView):
    def get(self, request):
        queryset = MyModel.objects.all()
        serializer = MyModelSerializer(queryset, many=True)
        return Response(serializer.data)

    def post(self, request):
        serializer = MyModelSerializer(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)

주요 구성 요소

  1. Fields: 시리얼라이저는 각 필드를 정의하여, 어떤 데이터가 직렬화되고 역직렬화될지를 결정합니다. 기본적으로 CharField, IntegerField, BooleanField 등 다양한 필드 타입을 제공합니다.

    class MyModelSerializer(serializers.Serializer):
        name = serializers.CharField(max_length=100)
        age = serializers.IntegerField()
  2. Validation: 각 필드에 대한 유효성 검사를 자동으로 수행하며, 추가적인 검증 로직도 커스터마이징할 수 있습니다.

    class MyModelSerializer(serializers.Serializer):
        name = serializers.CharField(max_length=100)
        age = serializers.IntegerField()
    
        def validate_age(self, value):
            if value < 0:
                raise serializers.ValidationError("Age must be a positive integer.")
            return value
  3. Meta 클래스: ModelSerializer에서 사용하는 메타 클래스는 모델과 시리얼라이저 간의 연결을 정의하며, 직렬화할 필드를 지정합니다.

    class MyModelSerializer(serializers.ModelSerializer):
        class Meta:
            model = MyModel
            fields = ['id', 'name', 'age']

시리얼라이저 종류

  • Serializer: 기본 시리얼라이저로, 모델과 독립적으로 작동하며 커스텀 검증 로직을 쉽게 추가할 수 있습니다.
  • ModelSerializer: Django 모델과 밀접하게 연관된 시리얼라이저로, 모델 필드를 자동으로 시리얼라이저 필드로 변환하며, 폼(form)과 유사한 인터페이스를 제공합니다. 일반적인 CRUD 작업에서 매우 유용합니다.

요약

  • Serializer: 데이터 직렬화 및 역직렬화, 데이터 검증을 위한 핵심 도구로, Django REST Framework에서 API 응답과 요청의 데이터 처리를 돕습니다.
  • ModelSerializer: Django 모델과 직접적으로 연관된 시리얼라이저로, 모델 기반 API를 쉽게 구축할 수 있게 해줍니다.
  • 사용 사례: API 응답으로 데이터를 반환하거나, 클라이언트로부터 받은 데이터를 검증 및 저장할 때 주로 사용됩니다.

시리얼라이저를 사용하면 Django 모델 데이터를 손쉽게 API로 노출하고, 클라이언트에서 받은 데이터를 안전하게 처리할 수 있습니다.

0개의 댓글