Serializer의 context를 활용하여 View의 정보 전달하기

View에서 처리 중인 request 객체 정보를 Serializer로 안전하고 명확하게 전달하는 방법으로, 뷰와 시리얼라이저를 잇는 공식적인 통로 역할

context란 무엇인가

  • Serializer가 인스턴스화될 때 주입할 수 있는 임의의 추가 데이터가 담긴 파이썬 딕셔너리

  • Serializer는 설계상 request 객체에 직접 접근할 수 없으므로, 필요한 정보만 선택적으로 전달하는 역할

View에서 context 전달하기

제네릭 뷰 사용 시

  • get_serializer_context() 메서드가 자동으로 처리

  • 기본적으로 request, format, view 객체가 context에 담겨 전달

APIView 사용 시

context = {
    'request': request,
    'my_custom_data': my_custom_data
}
serializer = MySerializer(data={}, context=context)

Serializer에서 context 사용하기

  • self.context 속성을 통해 접근

  • 안전한 접근을 위해 .get() 메서드 사용 권장

request = self.context.get('request')

주요 활용 사례

현재 로그인한 사용자 정보 활용

def get_is_liked(self, obj):
    request = self.context.get('request')
    if not request or not request.user.is_authenticated:
        return False
    return obj.liked_by.filter(pk=request.user.pk).exists()

사용자 권한에 따른 데이터 분기 처리

def get_personal_email(self, obj):
    request = self.context.get('request')
    if request and (request.user.is_staff or request.user == obj):
        return obj.email
    return None

주요 팁 및 주의사항

  • self.context.get('key') 사용으로 KeyError 방지

  • 제네릭 뷰 최대한 활용

  • context에는 필요한 최소한의 정보만 포함

주의사항

  • context 전달 누락 시 에러 발생 가능성

  • 테스트 시 Mock request 객체 필요

Last updated