피드로 돌아가기
44BITSBackend
원문 읽기
Django Rest Framework 레시피
Django Rest Framework의 ViewSet에서 get_queryset(), get_serializer_class(), SerializerMethodField를 활용해 인증된 사용자별 데이터 필터링, 메서드별 시리얼라이저 전환, 추가 필드 동적 생성을 구현
AI 요약
Context
Django Rest Framework로 REST API를 개발할 때 단일 시리얼라이저와 기본 쿼리셋만으로는 실전의 복잡한 요구사항을 충족하기 어렵다. 특히 사용자별 데이터 격리, 엔드포인트별 다른 응답 형식, 계산된 필드 추가 등을 개별 처리해야 한다.
Technical Solution
- 사용자별 데이터 격리: get_queryset() 메서드에서 self.request.user로 현재 인증된 사용자를 확인해 filter(user=self.request.user)로 쿼리셋 필터링
- 메서드별 시리얼라이저 전환: get_serializer_class()를 오버라이드해 self.action 값(create, update, retrieve 등)에 따라 AccountEditSerializer, AccountWithValuesSerializer 등 다른 시리얼라이저 반환
- 쿼리셋 애너테이션으로 필드 추가: queryset.annotate(positions_count=Count("positions", distinct=True), transactions_count=Count("positions__transactions", distinct=True))로 SQL 집계 결과를 필드화
- SerializerMethodField로 동적 필드 추가: serializers.SerializerMethodField()를 필드로 정의하고 get_필드이름() 메서드에서 커스텀 로직 실행(예: obj.value_history_per_position(from_date, to_date))
- 시리얼라이저 컨텍스트 활용: get_serializer_context()를 오버라이드해 from_date, to_date 같은 추가 데이터를 self.context에 전달하고 필드 계산이나 유효성 검증에 사용
Key Takeaway
Django Rest Framework의 ViewSet에서 제공하는 확장 포인트(get_queryset, get_serializer_class, context)를 적절히 활용하면 단일 모델과 시리얼라이저로도 복잡한 API 요구사항을 깔끔하게 구현할 수 있다.
실천 포인트
Django Rest Framework 기반 멀티테넌트 API를 개발할 때 get_queryset()에서 self.request.user로 필터링하고, get_serializer_class()에서 self.action별로 시리얼라이저를 전환하며, SerializerMethodField와 annotate()를 조합하면 엔드포인트별로 다른 응답 스키마와 필드를 효율적으로 제공할 수 있다.