DRF의 보기(django rest framework)
1)APIView
rest_framework.views.APIView
APIView
는 REST 프레임워크가 제공하는 모든 보기의 기본 클래스로 Django의 View
부류를 계승한다.APIView
와 View
의 차이점은 다음과 같습니다.Request
대상이지 Django의 HttpRequeset
대상이 아니다.Response
대상을 되돌려주고 보기는 응답 데이터 설정(render)이 전방 요구에 부합되는 형식을 설정합니다.APIException
이상도 포착되고 적합한 응답 정보로 처리된다.정의된 속성을 지원합니다.
APIView
에서 get(),post() 또는 다른 요청 방식을 일반적인 클래스 보기 정의 방법으로 구현합니다.예:
from rest_framework.views import APIView
from rest_framework.response import Response
# url(r'^books/$', views.BookListView.as_view()),
class BookListView(APIView):
def get(self, request):
books = BookInfo.objects.all()
serializer = BookInfoSerializer(books, many=True)
return Response(serializer.data)
2)GenericAPIView
rest_framework.generics.GenericAPIView
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)
2.5개 확장 클래스
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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Django의 질문 및 답변 웹사이트환영 친구, 이것은 우리의 새로운 블로그입니다. 이 블로그에서는 , 과 같은 Question-n-Answer 웹사이트를 만들고 있습니다. 이 웹사이트는 회원가입 및 로그인이 가능합니다. 로그인 후 사용자는 사용자의 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.