의외로 잘 모르지만 유용한 HiddenField

클라이언트에게 노출되지 않지만 서버 내부에서 default 값을 통해 설정되며, validated_data에 포함되어 create/update 시 사용되는 필드

HiddenField란?

클라이언트로부터 값을 받지 않지만, create나 update 시에 필요한 값을 내부적으로 설정하여 사용할 때 활용. 주로 request.user와 같이 요청 객체에 담긴 정보를 모델 객체에 저장할 때 유용

perform_create vs HiddenField

perform_create 사용

class PostCreateAPIView(generics.CreateAPIView):
    def perform_create(self, serializer):
        serializer.save(author=self.request.user)

HiddenField 사용

class PostSerializer(serializers.ModelSerializer):
    author = serializers.HiddenField(
        default=serializers.CurrentUserDefault()
    )

주요 장점

  • 책임의 응집: 데이터 관련 로직을 Serializer로 집중

  • View의 단순화: perform_create 오버라이드 불필요

  • 재사용성 증가: Serializer 자체에 로직 내장

언제 사용할까?

방법
추천 상황

HiddenField

request 정보 등 컨텍스트 기반 데이터를 모델 필드에 설정

perform_create

복잡한 비즈니스 로직이나 여러 모델을 함께 생성

create() 오버라이드

validated_data를 추가 가공하여 모델 생성

Custom Default 클래스

class PostFromURLDefault:
    def __call__(self, serializer_field):
        post_pk = serializer_field.context['view'].kwargs.get('post_pk')
        return post_pk

class CommentSerializer(serializers.ModelSerializer):
    post = serializers.HiddenField(default=PostFromURLDefault())

핵심 포인트

  • read_only=True와 달리 validated_data에 포함되어 create/update 로직에 사용 가능

  • CurrentUserDefault()는 DRF가 제공하는 기본 클래스로 request.user 자동 설정

  • 컨텍스트 의존성이 있으므로 Serializer 직접 사용 시 context 인자 전달 필수

Last updated