[DRF] 공식 문서 - views의 정리 5 - CBV(Concrete View Classes)
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
- reference :
https://velog.io/@nikevapormax/Django-REST-frameworkConcrete-View-Classes
'Django REST Framework > DRF 일반' 카테고리의 다른 글
[DRF] 공식 문서 - serializers 정리 (1) | 2024.01.14 |
---|---|
[DRF] 공식 문서 - views의 정리 6 - CBV(Viewsets) (1) | 2024.01.11 |
[DRF] 공식 문서 - views의 정리 4 - CBV(Mixins) (0) | 2024.01.10 |
[DRF] 공식 문서 - views의 정리 3 - CBV(Generic views) (0) | 2024.01.10 |
[DRF] 공식 문서 - views의 정리 2 - CBV(APIView) (0) | 2024.01.08 |
댓글