Rest Framework에서 View, APIView 및 GenericAPIView 비교 분석 정보
APIView
는 REST 프레임워크가 제공하는 모든 보기의 기본 클래스로 Django의 View
부류를 계승한다.A
PIView
와 View
의 차이점은 다음과 같다.보기 방법에 전송된 것은 REST 프레임워크의
Request
대상이지 Django의 HttpRequeset
대상이 아니다. 보기 방법은 REST 프레임워크의
Response
대상을 되돌려주고 보기는 응답 데이터 설정(render)이 전방 요구에 부합되는 형식을 설정합니다. APIException
이상은 모두 포착되고 적합한 응답 정보로 처리됩니다. 정의된 속성을 지원합니다.
APIVIew
에서 계승하여 목록 보기와 상세한 보기에 사용할 수 있는 일반적인 지원 방법을 추가했습니다.일반적으로 사용하는 경우 하나 이상의 Mixin 확장 클래스와 함께 사용할 수 있습니다.정의된 속성을 지원합니다.
pk
' 제공되는 방법:
queryset
속성은 다시 쓸 수 있습니다. 예를 들어 def get_queryset(self):
user = self.request.user
return user.accounts.all()
serializer_class
는 다시 쓸 수 있습니다. 예를 들어 def get_serializer_class(self):
if self.request.user.is_staff:
return FullAccountSerializer
return BasicAccountSerializer
lookup_field
인자로queryset을 필터합니다.시도에서 이 방법으로 자세한 정보를 얻을 수 있는 모델 클래스의 대상을 호출할 수 있습니다.자세한 정보를 방문한 모델 클래스의 대상이 존재하지 않으면 404로 돌아갑니다.이 메서드는 기본적으로 APIView에서 제공하는 check 를 사용합니다.object_permissions 방법은 현재 대상이 접근할 수 있는 권한이 있는지 확인합니다.예:
# url(r'^books/(?P\d+)/$', views.BookDetailView.as_view()),
class BookDetailView(GenericAPIView):
queryset = BookInfo.objects.all()
serializer_class = BookInfoSerializer
def get(self, request, pk):
book = self.get_object()
serializer = self.get_serializer(book)
return Response(serializer.data)
!!!!다섯 개의 확장 클래스!!!!
1)ListModelMixin
목록 보기 확장 클래스, 제공
list(request, *args, **kwargs)
방법으로 목록 보기를 신속하게 실현하고 200 상태 코드를 되돌려줍니다.Mixin의list 메서드는 데이터를 필터링하고 페이지를 나눕니다.
소스 코드:
class ListModelMixin(object):
"""
List a queryset.
"""
def list(self, request, *args, **kwargs):
#
queryset = self.filter_queryset(self.get_queryset())
#
page = self.paginate_queryset(queryset)
if page is not None:
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data)
#
serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data)
예:
from rest_framework.mixins import ListModelMixin
class BookListView(ListModelMixin, GenericAPIView):
queryset = BookInfo.objects.all()
serializer_class = BookInfoSerializer
def get(self, request):
return self.list(request)
2)CreateModelMixin
보기 확장 클래스를 만들고
create(request, *args, **kwargs)
방법을 제공하여 자원을 만드는 보기를 신속하게 실현하고 201 상태 코드를 성공적으로 되돌려줍니다.만약 서열화기가 전방에서 보낸 데이터 검증에 실패하면 400 오류를 되돌려줍니다.
소스 코드:
class CreateModelMixin(object):
"""
Create a model instance.
"""
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)
def perform_create(self, serializer):
serializer.save()
def get_success_headers(self, data):
try:
return {'Location': str(data[api_settings.URL_FIELD_NAME])}
except (TypeError, KeyError):
return {}
3) RetrieveModelMixin
상세한 보기 확장 클래스는
retrieve(request, *args, **kwargs)
방법을 제공하여 존재하는 데이터 대상을 신속하게 되돌릴 수 있습니다.존재하면 200으로 돌아가고 그렇지 않으면 404로 돌아갑니다.
소스 코드:
class RetrieveModelMixin(object):
"""
Retrieve a model instance.
"""
def retrieve(self, request, *args, **kwargs):
# ,
instance = self.get_object()
#
serializer = self.get_serializer(instance)
return Response(serializer.data)
예:
class BookDetailView(RetrieveModelMixin, GenericAPIView):
queryset = BookInfo.objects.all()
serializer_class = BookInfoSerializer
def get(self, request, pk):
return self.retrieve(request)
4)UpdateModelMixin
보기 확장 클래스를 업데이트하고
update(request, *args, **kwargs)
방법을 제공하여 존재하는 데이터 대상을 신속하게 업데이트할 수 있습니다.또한
partial_update(request, *args, **kwargs)
방법을 제공하여 국부 업데이트를 실현할 수 있다.200 을 성공적으로 되돌렸고, 서열화기 검사 데이터가 실패했을 때 400 오류를 되돌려줍니다.
소스 코드:
class UpdateModelMixin(object):
"""
Update a model instance.
"""
def update(self, request, *args, **kwargs):
partial = kwargs.pop('partial', False)
instance = self.get_object()
serializer = self.get_serializer(instance, data=request.data, partial=partial)
serializer.is_valid(raise_exception=True)
self.perform_update(serializer)
if getattr(instance, '_prefetched_objects_cache', None):
# If 'prefetch_related' has been applied to a queryset, we need to
# forcibly invalidate the prefetch cache on the instance.
instance._prefetched_objects_cache = {}
return Response(serializer.data)
def perform_update(self, serializer):
serializer.save()
def partial_update(self, request, *args, **kwargs):
kwargs['partial'] = True
return self.update(request, *args, **kwargs)
5)DestroyModelMixin
보기 확장 클래스를 삭제하고
destroy(request, *args, **kwargs)
방법을 제공하면 존재하는 데이터 대상을 신속하게 삭제할 수 있습니다.204를 성공적으로 반환했습니다. 404를 반환한 것은 존재하지 않습니다.
소스 코드:
class DestroyModelMixin(object):
"""
Destroy a model instance.
"""
def destroy(self, request, *args, **kwargs):
instance = self.get_object()
self.perform_destroy(instance)
return Response(status=status.HTTP_204_NO_CONTENT)
def perform_destroy(self, instance):
instance.delete()
3. 사용 가능한 하위 클래스 보기
1) CreateAPIView
post 방법 제공
GenericAPIView, CreateModelMixin에서 상속
2)ListAPIView
get 방법 제공
상속: GenericAPIView, ListModelMixin
3)RetireveAPIView
get 방법 제공
상속: GenericAPIView, RetrieveModelMixin
4)DestoryAPIView
삭제 방법 제공
GenericAPIView, DestoryModelMixin에서 상속
5)UpdateAPIView
put 및 patch 방법 제공
상속: GenericAPIView, UpdateModelMixin
6)RetrieveUpdateAPIView
get,put,patch 방법 제공
GenericAPIView, RetrieveModelMixin, UpdateModelMixin
7)RetrieveUpdateDestoryAPIView
get,put,patch,delete 방법 제공
GenericAPIView, RetrieveModelMixin, UpdateModelMixin, DestoryModelMixin
뷰세트 ViewSet
뷰세트 ViewSet을 사용하여 일련의 논리적 관련 작업을 하나의 클래스에 배치할 수 있습니다.
뷰 세트는 as 만 사용view () 방법이 있을 때 액션 동작을 구체적인 요청 방식과 대응합니다.예:
class BookInfoViewSet(viewsets.ViewSet):
def list(self, request):
...
def retrieve(self, request, pk=None):
...
경로를 설정할 때 우리는 다음과 같이 조작할 수 있다
urlpatterns = [
url(r'^books/$', BookInfoViewSet.as_view({'get':'list'}),
url(r'^books/(?P\d+)/$' , BookInfoViewSet.as_view({'get': 'retrieve'})
]
action 속성
보기 집합에서 현재 보기 집합을 요청할 때의 액션 동작이 무엇인지 액션 대상 속성을 얻을 수 있습니다.
예를 들면 다음과 같습니다.
def get_serializer_class(self):
if self.action == 'create':
return OrderCommitSerializer
else:
return OrderDataSerializer
공통 뷰 세트 상위 클래스
1) ViewSet
계승자
APIView
는 APIView와 기본적으로 유사한 역할을 하며 신분인증, 권한 검사, 데이터 관리 등을 제공했다.ViewSet에서 어떤 동작 액션 방법도 제공하지 않았습니다. 우리가 직접 액션 방법을 실현해야 합니다.
2)GenericViewSet
GenericAPIVIew와 유사하게 getobject、get_queryset 등 방법은 목록 보기와 상세한 정보 보기의 개발에 편리하다.
3)ModelViewSet
계승자
GenericAPIView
에는List Model Mixin,Retrieve Model Mixin,Create Model Mixin,Update Model Mixin,Destory Model Mixin이 포함되어 있다.4)ReadOnlyModelViewSet
계승자
GenericAPIVIew
는ListModelMixin,RetrieveModelMixin을 포함한다.보기 집중 정의 추가 액션 동작
뷰 세트에서 위의 기본 메소드 동작 외에도 사용자 정의 동작을 추가할 수 있습니다.
사용자 정의 동작을 추가하려면
GenericAPIVIew
장식기를 사용해야 합니다.액션 장식기로 장식하는 방법명은 액션 동작명으로 리스트,retrieve와 동일합니다.
action 장식기는 두 개의 매개 변수를 수신할 수 있습니다:
예:
from rest_framework import mixins
from rest_framework.viewsets import GenericViewSet
from rest_framework.decorators import action
class BookInfoViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, GenericViewSet):
queryset = BookInfo.objects.all()
serializer_class = BookInfoSerializer
# detail False BookInfo
@action(methods=['get'], detail=False)
def latest(self, request):
"""
"""
book = BookInfo.objects.latest('id')
serializer = self.get_serializer(book)
return Response(serializer.data)
# detail True, pk BookInfo
@action(methods=['put'], detail=True)
def read(self, request, pk):
"""
"""
book = self.get_object()
book.bread = request.data.get('read')
book.save()
serializer = self.get_serializer(book)
return Response(serializer.data)
url의 정의
urlpatterns = [
url(r'^books/$', views.BookInfoViewSet.as_view({'get': 'list'})),
url(r'^books/latest/$', views.BookInfoViewSet.as_view({'get': 'latest'})),
url(r'^books/(?P\d+)/$' , views.BookInfoViewSet.as_view({'get': 'retrieve'})),
url(r'^books/(?P\d+)/read/$' , views.BookInfoViewSet.as_view({'put': 'read'})),
]
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.