Django REST Framework: Serializer의 Partial Update?
Django REST Framework(DRF)를 사용하다 보면 데이터의 부분 수정(Partial Update)을 처리해야 할 때가 있습니다. 이때 Serializer의 partial 옵션을 활용하면 편리하게 작업할 수 있습니다. 이번 포스팅에서는 Serializer의 partial이 무엇인지, 어떻게 사용하는지, 주의할 점은 무엇인지 상세하게 알아보겠습니다.
Partial Update란?
Partial Update는 말 그대로 객체의 일부 필드만을 수정하는 것을 의미합니다. 전체 데이터를 수정하는 PUT 요청과 달리 PATCH 요청을 통해 일부 데이터만 선택적으로 업데이트할 수 있도록 도와줍니다.
- PUT: 객체의 모든 필드를 업데이트해야 함.
- PATCH: 객체의 일부 필드만 업데이트 가능.
Serializer에서 Partial 옵션 사용법
DRF의 Serializer를 사용할 때 partial=True로 설정하면 일부 필드만으로도 유효성 검사를 통과시킬 수 있습니다.
기본 사용 예제
# serializers.py
from rest_framework import serializers
from .models import Profile
class ProfileSerializer(serializers.ModelSerializer):
class Meta:
model = Profile
fields = ['id', 'username', 'email', 'bio']
위의 Serializer를 이용해 객체를 부분적으로 업데이트하는 방법을 살펴보겠습니다.
# views.py
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from .models import Profile
from .serializers import ProfileSerializer
class ProfileDetailAPIView(APIView):
def patch(self, request, pk):
profile = Profile.objects.get(pk=pk)
serializer = ProfileSerializer(profile, data=request.data, partial=True)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
위 코드에서 핵심은 바로 partial=True입니다. 이 설정이 없다면 Serializer는 모든 필드를 요구하게 되므로 일부 필드만 수정하고자 할 때는 반드시 설정해야 합니다.
예제 요청 및 응답
PATCH 요청의 예시는 다음과 같습니다.
- 요청 예시
PATCH /api/profiles/1/
{
"bio": "새로운 자기소개입니다."
}
- 응답 예시
{
"id": 1,
"username": "user123",
"email": "user123@example.com",
"bio": "새로운 자기소개입니다."
}
주의사항
1. Validation 주의
부분 업데이트 시에도 필드별 validation은 정상적으로 수행됩니다. 특정 필드에 validation 로직이 있는 경우 이를 충족하지 못하면 validation error가 발생할 수 있습니다.
2. Required 필드 주의
Serializer에서 필드를 required=True로 설정한 경우, 전체 업데이트에서는 필수지만 부분 업데이트에서는 해당 필드가 제공되지 않아도 문제가 되지 않습니다. 하지만, 제공될 경우는 반드시 유효해야 합니다.
예시:
email = serializers.EmailField(required=True)
- 전체 업데이트(PUT) 시: 반드시 필요
- 부분 업데이트(PATCH) 시: 제공되지 않아도 됨, 단, 제공할 경우 유효해야 함
활용 팁
1. ViewSet 활용하기
일반적인 APIView보다 DRF의 ViewSet을 사용하면 더욱 간편히 부분 업데이트를 처리할 수 있습니다.
# views.py
from rest_framework import viewsets
class ProfileViewSet(viewsets.ModelViewSet):
queryset = Profile.objects.all()
serializer_class = ProfileSerializer
ModelViewSet은 기본적으로 partial_update 메서드를 지원하여 편리하게 PATCH 요청을 처리합니다.
2. Serializer 내에서 조건부 validation 구현
Serializer의 validate_<field> 메서드를 통해 특정 조건에서만 필드 검사를 수행하도록 구현할 수 있습니다.
def validate_email(self, value):
if self.partial and value == "":
raise serializers.ValidationError("빈 이메일은 허용되지 않습니다.")
return value
결론
Django REST Framework의 partial=True 옵션을 활용하면 API를 더욱 유연하게 구성할 수 있습니다.