DRF(Django REST Framework)의 시리얼라이저는 모델 인스턴스·QuerySet을 JSON으로 바꿀 수 있는 파이썬 기본 자료형으로 바꾸고(직렬화, serialization), 반대로 들어온 데이터를 검증해 모델로 만드는(역직렬화, deserialization) 틀이다. 장고의 Form과 비슷하게 필드와 검증 규칙을 선언한다.
직렬화: QuerySet → (serializer.data) dict → (Renderer) JSON 응답
역직렬화: JSON 요청 → (Parser) dict → (is_valid) 검증 → (save) 모델- 응답으로 내보낼 때는
to_representation, 받아들일 때는to_internal_value가 호출된다. 출력 모양을 바꾸려면to_representation을 덮어쓴다 - JSON 변환 앞뒤는 파서(parser)·렌더러(renderer)가 맡는다(DRF 파서·렌더러와 콘텐츠 협상)
Serializer와 ModelSerializer
class MovieSerializer(serializers.ModelSerializer):
review_count = serializers.SerializerMethodField()
class Meta:
model = Movie
fields = ["id", "title", "description", "active", "review_count"]
read_only_fields = ["id"]
def get_review_count(self, obj):
return obj.reviews.count()
def validate_title(self, value): # 필드 단위
if len(value) < 2:
raise serializers.ValidationError("제목은 두 글자 이상")
return value
def validate(self, data): # 여러 필드에 걸친 검증
if data["title"] == data.get("description"):
raise serializers.ValidationError("제목과 설명이 같을 수 없습니다")
return dataModelSerializer는 모델에서 필드와 기본 검증기를 자동으로 만들고create()·update()를 기본 구현한다. 일반Serializer는 모두 직접 쓴다- 검증은 세 층이다:
validate_<필드>,validate(), 필드의validators=[...] - 역직렬화할 때는 반드시
serializer.is_valid()를 먼저 부르고, 실패하면serializer.errors에 필드별 오류가 담긴다.is_valid(raise_exception=True)면 400 응답으로 바로 이어진다 read_only,write_only(비밀번호),required,source(다른 속성 이름에서 읽기) 같은 핵심 인자로 입출력을 나눈다
관계 표현
- 중첩 시리얼라이저(nested serializer): 연관 객체 전체를 넣는다
StringRelatedField: 연관 객체의__str__결과PrimaryKeyRelatedField: 연관 객체의 pk만HyperlinkedRelatedField·HyperlinkedModelSerializer: pk 대신 상세 API URL. 시리얼라이저에context={"request": request}를 넘겨야 한다
중첩 관계를 직렬화할 때 쿼리가 폭증하지 않게 뷰의 QuerySet에서 select_related·prefetch_related를 건다(Django 모델 매니저와 QuerySet, N+1 문제). 스프링에서는 DTO(Data Transfer Object)와 Bean Validation이 같은 역할을 나눠 맡는다.
출처: DRF Serializers: Validation · ModelSerializer · Overriding serialization and deserialization behavior · DRF Serializer relations