의외로 잘 모르지만 유용한 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
