Serializer 주요 함수 및 활용

DRF Serializer에서 자주 사용되는 핵심 함수들과 데이터 검증 및 변환 활용법

to_representation

직렬화 출력 데이터 커스터마이징. 모델 데이터를 JSON으로 변환할 때 추가 필드나 변환 로직 적용

def to_representation(self, instance):
    representation = super().to_representation(instance)
    representation['likes_count'] = instance.liked_by.count()
    representation['is_favorite'] = instance in self.context['user'].favorites.all()
    return representation

to_internal_value

역직렬화 입력 데이터 전처리. JSON에서 Python 객체로 변환할 때 데이터 정제 및 변환

def to_internal_value(self, data):
    # 불필요한 중첩 데이터 제거
    if 'info' in data:
        data.pop('info')
    return super().to_internal_value(data)

validate

객체 레벨 검증. 여러 필드를 조합한 복합 검증 로직 구현

def validate(self, attrs):
    if attrs['end_date'] < attrs['start_date']:
        raise serializers.ValidationError("종료일은 시작일보다 늦어야 함")
    return attrs

validate_{field_name}

개별 필드 검증. 특정 필드에 대한 커스텀 검증 로직

def validate_email(self, value):
    if User.objects.filter(email=value).exists():
        raise serializers.ValidationError("이미 사용 중인 이메일")
    return value

def validate_age(self, value):
    if value < 18:
        raise serializers.ValidationError("18세 이상만 가입 가능")
    return value

save

validated_data를 사용하여 객체 생성/수정

def save(self):
    validated_data = self.validated_data
    if self.instance:
        return self.update(self.instance, validated_data)
    return self.create(validated_data)

create

새 객체 생성 로직 커스터마이징

def create(self, validated_data):
    password = validated_data.pop('password')
    user = User.objects.create_user(**validated_data)
    user.set_password(password)
    user.save()
    return user

update

기존 객체 수정 로직 커스터마이징

def update(self, instance, validated_data):
    password = validated_data.pop('password', None)
    for attr, value in validated_data.items():
        setattr(instance, attr, value)
    
    if password:
        instance.set_password(password)
    instance.save()
    return instance

validators 속성

필드별 검증 함수 목록 정의

def validate_username(value):
    if len(value) < 3:
        raise serializers.ValidationError("사용자명은 3자 이상이어야 함")
    return value

class UserSerializer(serializers.ModelSerializer):
    username = serializers.CharField(validators=[validate_username])

SerializerMethodField

읽기 전용 계산된 필드 추가

class PostSerializer(serializers.ModelSerializer):
    comment_count = serializers.SerializerMethodField()
    days_since_created = serializers.SerializerMethodField()
    
    def get_comment_count(self, obj):
        return obj.comments.count()
    
    def get_days_since_created(self, obj):
        return (timezone.now().date() - obj.created_at.date()).days

get_{field_name}

SerializerMethodField와 함께 사용되는 메서드

full_name = serializers.SerializerMethodField()

def get_full_name(self, obj):
    return f"{obj.first_name} {obj.last_name}"

Last updated