Django REST Framework/DRF 일반

[DRF] 공식 문서 - views의 정리 5 - CBV(Concrete View Classes)

bluebamus 2024. 1. 11.

 3. Concrete View Classes

   - Concrete View Classes와 mixin의 사용 목적 :

      1) Concrete View Classes :
         - 객체 나열(ListAPIView), 단일 객체 검색(RetrieveAPIView) 등과 같이 특정 유형의 뷰에 대한 완전하고 표준화된 구현을 원할 때 콘크리트 뷰 클래스를 사용한다.
          - 많은 사용자 정의 없이 일관되고 간단한 동작이 필요한 보기에 선택한다.


      2) mixin :

         - 뷰 구성 요소를 모듈화하고 뷰에 추가된 기능을 더 효과적으로 제어하려면 믹스인을 사용한다.
         - 단일 뷰에서 여러 기능을 구성해야 하거나 다양한 뷰에서 특정 동작을 재사용하려는 경우 믹스인을 선택한다.

 

   - 정의

      - 하단의 class들은 구체적인 generic view들이다.
      - generic view를 사용하게 된다면, 많이 custom된 행위들을 사용하지 않는 한 하단의 class들이 작업하는 일반적인 수준이 된다.
      - 해당 view class들은 rest_framework.generics를 import해 사용한다.

 

    - CreateAPIView

      - create-only 엔드포인트일 때 사용한다.
      - post method 핸들러를 제공한다.
      - 확장 :
         - GenericAPIView
         - CreateModelMixin

from rest_framework.generics import CreateAPIView
from rest_framework.response import Response
from rest_framework import status

from .models import YourModel
from .serializers import YourModelSerializer

class YourModelCreateAPIView(CreateAPIView):
    queryset = YourModel.objects.all()
    serializer_class = YourModelSerializer

    # 생략 가능
    def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)

        self.perform_create(serializer)
        headers = self.get_success_headers(serializer.data)

        return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)


      - ListAPIView

         - collection of model instance를 위한 read-only 엔드포인트에 사용한다.
         - get method 핸들러를 제공한다.
         - 확장 :
            - GenericAPIView
             - ListModelMixin

from rest_framework.generics import ListAPIView
from rest_framework.response import Response
from .models import YourModel
from .serializers import YourModelSerializer

class YourModelListAPIView(ListAPIView):
    queryset = YourModel.objects.all()
    serializer_class = YourModelSerializer

    def list(self, request, *args, **kwargs):
        """
        Customized list endpoint with hypothetical scenarios.
        """
        # Scenario 1: Get the default list response
        response = super().list(request, *args, **kwargs)
        
        # Scenario 2: Add custom data to the response
        custom_data = {'message': 'Custom message', 'status': 'OK'}
        response.data['custom_data'] = custom_data

        # Scenario 3: Perform additional processing before returning the response
        queryset = self.filter_queryset(self.get_queryset())
        processed_data = self.process_data(queryset)
        response.data['processed_data'] = processed_data

        return response

    def process_data(self, queryset):
        """
        Hypothetical method to perform additional processing on the queryset data.
        """
        # Example: Modify each instance in the queryset
        processed_data = [{'id': item.id, 'name': f"Processed {item.name}"} for item in queryset]
        return processed_data


      - RetrieveAPIView

         - single model instance를 위한 read-only 엔드포인트에 사용한다.
         - get method 핸들러를 제공한다.
         - 확장 :
            - GenericAPIView
            - RetrieveModelMixin

from rest_framework.generics import RetrieveAPIView
from rest_framework.response import Response
from .models import YourModel
from .serializers import YourModelSerializer

class YourModelRetrieveAPIView(RetrieveAPIView):
    queryset = YourModel.objects.all()
    serializer_class = YourModelSerializer

    def retrieve(self, request, *args, **kwargs):
        """
        Customized retrieve endpoint with hypothetical scenarios.
        """
        # Scenario 1: Get the default retrieve response
        response = super().retrieve(request, *args, **kwargs)
        
        # Scenario 2: Add custom data to the response
        custom_data = {'message': 'Custom message', 'status': 'OK'}
        response.data['custom_data'] = custom_data

        # Scenario 3: Perform additional processing before returning the response
        instance = self.get_object()
        processed_data = self.process_data(instance)
        response.data['processed_data'] = processed_data

        return response

    def process_data(self, instance):
        """
        Hypothetical method to perform additional processing on the retrieved instance data.
        """
        # Example: Modify the retrieved instance data
        processed_data = {'id': instance.id, 'name': f"Processed {instance.name}"}
        return processed_data


      - DestroyAPIView

         - single model instance를 위한 delete-only 엔드포인트에 사용한다.
         - delete method 핸들러를 제공한다.
         - 확장 :
            - GenericAPIView
            - DestroyModelMixin

from rest_framework.generics import DestroyAPIView
from rest_framework.response import Response
from rest_framework import status
from .models import YourModel
from .serializers import YourModelSerializer

class YourModelDestroyAPIView(DestroyAPIView):
    queryset = YourModel.objects.all()
    serializer_class = YourModelSerializer

    def destroy(self, request, *args, **kwargs):
        """
        Customized destroy endpoint with hypothetical scenarios.
        """
        # Scenario 1: Get the default destroy response
        response = super().destroy(request, *args, **kwargs)
        
        # Scenario 2: Add custom data to the response
        custom_data = {'message': 'Custom message', 'status': 'OK'}
        response.data['custom_data'] = custom_data

        # Scenario 3: Perform additional processing after the instance is deleted
        deleted_instance_id = self.kwargs.get(self.lookup_field)
        processed_data = self.process_deletion(deleted_instance_id)
        response.data['processed_data'] = processed_data

        return response

    def process_deletion(self, deleted_instance_id):
        """
        Hypothetical method to perform additional processing after the instance is deleted.
        """
        # Example: Record the deleted instance ID
        processed_data = {'deleted_instance_id': deleted_instance_id}
        return processed_data


      - UpdateAPIView

         - single model instance를 위한 update-only 엔드포인트에 사용한다.
         - put과 patch method 핸들러를 제공한다.
         - 확장 :
            - GenericAPIView
            - UpdateModelMixin

from rest_framework.generics import UpdateAPIView
from rest_framework.response import Response
from .models import YourModel
from .serializers import YourModelSerializer

class YourModelUpdateAPIView(UpdateAPIView):
    queryset = YourModel.objects.all()
    serializer_class = YourModelSerializer

    def update(self, request, *args, **kwargs):
        """
        Customized update endpoint with hypothetical scenarios.
        """
        # Scenario 1: Get the default update response
        response = super().update(request, *args, **kwargs)
        
        # Scenario 2: Add custom data to the response
        custom_data = {'message': 'Custom message', 'status': 'OK'}
        response.data['custom_data'] = custom_data

        # Scenario 3: Perform additional processing after the instance is updated
        updated_instance = self.get_object()
        processed_data = self.process_update(updated_instance)
        response.data['processed_data'] = processed_data

        return response

    def process_update(self, updated_instance):
        """
        Hypothetical method to perform additional processing after the instance is updated.
        """
        # Example: Record details of the updated instance
        processed_data = {'updated_instance_id': updated_instance.id, 'updated_name': updated_instance.name}
        return processed_data


      - ListCreateAPIView

         - collection of model instance를 위한 read-write 엔드포인트에 사용한다.
         - get과 post method 핸들러를 제공한다.
         - 확장 : 
            - GenericAPIView
            - ListModelMixin
            - CreateModelMixin


      - RetrieveUpdateAPIView

         - single model instance를 위한 read or update 엔드포인트에 사용한다.
         - get과 put, patch method 핸들러를 제공한다.
         - 확장 :
            - GenericAPIView
            - RetrieveModelMixin
            - UpdateModelMixin


      - RetrieveDestroyAPIView

         - single model instance를 위한 read or delete 엔드포인트에 사용한다.
         - get과 delete method 핸들러를 제공한다.
         - 확장 :
            - GenericAPIView
            - RetrieveModelMixin
            - DestroyModelMixin


      - RetrieveUpdateDestroyAPIView

         - single model instance를 위한 read-write-delete 엔드포인트에 사용한다.
         - get과 put, patch, delete method 핸들러를 제공한다.
         - 확장 :
            - GenericAPIView
            - RetrieveModelMixin
            - UpdateModelMixin
            - DestroyModelMixin

 

 - 공식 사이트 문서 :https://www.django-rest-framework.org/api-guide/generic-views/#concrete-view-classes

 

Generic views - Django REST framework

 

www.django-rest-framework.org

 

 - reference : 

https://velog.io/@nikevapormax/Django-REST-frameworkConcrete-View-Classes

 

Django REST framework_Concrete View Classes

Django REST framework Concrete View Classes

velog.io

 

댓글