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 객체 필요
Previousto_representation vs to_internal_value 오버라이드 기준NextListSerializer 커스텀으로 bulk_create/update 구현
Last updated
