Django REST Framework(DRF)에서 Serializer는 Django 모델 인스턴스나 쿼리셋과 같은 복잡한 데이터 타입을 JSON, XML 등의 네이티브 데이터 타입으로 변환하는 데 사용됩니다. 반대로, 클라이언트로부터 받은 JSON 데이터를 Django의 데이터 타입으로 변환해 데이터베이스에 저장하기 위해 검증하고, 역직렬화(deserialization)하는 역할도 합니다.
아래는 기본적인 시리얼라이저 사용 예시입니다.
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)
Fields: 시리얼라이저는 각 필드를 정의하여, 어떤 데이터가 직렬화되고 역직렬화될지를 결정합니다. 기본적으로 CharField, IntegerField, BooleanField 등 다양한 필드 타입을 제공합니다.
class MyModelSerializer(serializers.Serializer):
name = serializers.CharField(max_length=100)
age = serializers.IntegerField()
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
Meta 클래스: ModelSerializer에서 사용하는 메타 클래스는 모델과 시리얼라이저 간의 연결을 정의하며, 직렬화할 필드를 지정합니다.
class MyModelSerializer(serializers.ModelSerializer):
class Meta:
model = MyModel
fields = ['id', 'name', 'age']
시리얼라이저를 사용하면 Django 모델 데이터를 손쉽게 API로 노출하고, 클라이언트에서 받은 데이터를 안전하게 처리할 수 있습니다.