보기 클래스와 보기 집합의 기본 사용
1. 뷰 클래스: View, APIView, GenericAPIView
View는 Django에서 제공하는 보기 클래스입니다. 클래스의 반환 값은Http Response, JSON Response에 필요합니다.
(1), APIView
Django에서 정의한 뷰를 상속하지만 뷰와는 두 가지 차이가 있습니다.
#
class MyCursorPagination(CursorPagination):
cursor_query_param = 'cursor'
page_size = 2
max_page_size = 4
max_page_size_param = 'size'
page_param = 'cursor'
ordering = 'id'
# : , ,ordering = ‘ ’
class APIView1(APIView):
#
def get(self, request, *args, **kwargs):
role_obj = Role.objects.all()
pg = MyCursorPagination()
page = pg.paginate_queryset(queryset=role_obj, request=request, view=self)
serializer = Page2Serializer(instance=page, many=True)
return pg.get_paginated_response(serializer.data)
#
def post(self, request, *args, **kwargs):
data_dict = request.data
serializer = Page2Serializer(data=data_dict)
result = serializer.is_valid(raise_exception=True)
if result:
serializer.save()
# .save()
return Response(serializer.validated_data)
class APIView2(APIView):
#
def get(self, request, pk):
role_obj = Role.objects.get(pk=pk).first()
serializer = Page2Serializer(instance=role_obj)
return Response(serializer.data)
#
def put(self, request, pk):
data_dict = request.data
serializer = Page2Serializer(data=data_dict)
result = serializer.is_valid(raise_exception=True)
# : , ,
if result:
serializer.save()
return Response(serializer.validated_data)
#
def delete(self, request, pk):
role_obj = Role.objects.filter(pk=pk)
role_obj.delete()
return Response(" ")
(2), GenericAPIView
GenericAPIView는 APIView에서 상속되는데, APIView와 차이점은 사용된 데이터 집합과 사용된 구성 요소의 클래스를 전역 변수로 정의하여 보기 클래스에서 사용해야 한다는 것이다.
# Create your views here.
class TestGenericAPIView(GenericAPIView):
queryset = UserInfo.objects.all()
serializer_class = UserInfoSerializer1
pagination_class = PageNumberPagination
# GenericAPIView APIView View queryset , ,
def get(self, request, *args, **kwargs):
queryset = self.get_queryset()
pg = self.paginate_queryset(queryset=queryset)
serializer = self.get_serializer(instance=pg, many=True)
return Response(serializer.data)
# GenericAPIView APIView , generic.py , , , , 、 , 。 APIView 。
2. 뷰 세트의 사용:GenericViewSet, ModelViewSet
Note
보기 집합의 사용과 보기 클래스는 매우 중요한 차이가 있다. 보기 집합은 처리 방법 이름을 사용자 정의할 수 있으며, 이러한 방법 이름은 반드시 as 에 성명해야 한다view ({'request 방식 ':' 방법 이름'}) 안에 있습니다.뷰 세트는 뷰 클래스의 두 가지 문제를 해결합니다.
(1) GenericViewSet 클래스의 사용
이 클래스는GenericAPIView와ViewSetMxixin 두 클래스를 계승하고GenericAPIView의 모든 속성과 방법을 가지며self를 통해 모든 클래스와queryset을 얻어야 한다. 만약에 삭제 수정 중의 일부 방법을 직접 사용하려면 Mixins 확장 중의 클래스를 단독으로 계승해야 한다. 이런 클래스는GenericAPIView보다 계승해야 한다.확장 클래스를 계승하지 않으면 처리 방법을 사용자 정의해야 합니다
from rest_framework.viewsets import GenericViewSet
from rest_framework.pagination import CursorPagination
class MyPagination(CursorPagination):
page_size = 1
page_param = 'page'
max_page_size = 5
max_page_size_param = 'size'
ordering = 'id'
cursor_query_param = 'cursor'
#
class GenericViewSet1(GenericViewSet):
queryset = UserInfo.objects.all()
serializer_class = UserInfoSerializer1
# pagination_class = PageNumberPagination
pagination_class = MyPagination
def list(self, request, *args, **kwargs):
queryset = self.get_queryset()
pg = self.paginate_queryset(queryset=queryset)
serializer = self.get_serializer(instance=pg, many=True)
data = pg.get_paginated_response(serializer.data)
# GenericAPIView
return data
#
from rest_framework.mixins import ListModelMixin, RetrieveModelMixin, CreateModelMixin, UpdateModelMixin, DestroyModelMixin
from rest_framework.viewsets import GenericViewSet
class View3View(ListModelMixin, RetrieveModelMixin, CreateModelMixin, UpdateModelMixin, DestroyModelMixin, GenericViewSet):
queryset = Role.objects.all()
serializer_class = Page2Serializer
pagination_class = LimitOffsetPagination
(2) ModelViewSet 뷰셋 사용
Note
ModelViewSet 클래스의 사용에서 주의해야 할 것은 이 클래스를 계승하면 보기 클래스에서 사용자 정의 Request 요청 방법이 필요하지 않으며, 이 클래스는 삭제, 수정 등 기본적인 처리 방법을 봉인하여 Mixins 확장의 다섯 가지 클래스를 직접 계승하여 사용할 수 있다.프로필이 편리해 직접 사용할 수 있다는 장점이 있다.단점은 이 종류의 포장 종류는 대부분 방법이 아니라 이런 인터페이스가 모두 필요할 때만 이 종류가 가장 좋은 선택이고 이 종류의 맞춤형 제작성이 높지 않다는 것이다.
--serializers.py
class Page2Serializer(serializers.Serializer):
id = serializers.IntegerField()
title = serializers.CharField()
def validate(self, data):
id = data.get('id')
title = data.get('title')
return data
# , , 。
def create(self, validated_data):
id = validated_data.get('id')
title = validated_data.get('title')
instance = Role.objects.create(id=id, title=title)
instance.save()
return instance
def update(self, instance, validated_data):
id = validated_data.get('id')
title = validated_data.get('title')
instance = Role.objects.filter(id=id).first()
instance.id = id
instance.title = title
instance.save()
return instance
'''
: Serializer , , create update ,
'''
--views.py
class View2View(ModelViewSet):
queryset = Role.objects.all()
serializer_class = Page2Serializer
pagination_class = PageNumberPagination
기본 클래스에는 두 가지 방법이 있지만 모두pass이기 때문에 두 가지 방법을 다시 쓰지 않으면 시스템이 정상적으로 작동할 수 없습니다
3. Mixin의 다섯 가지 확장 클래스
Note
포장된 내용이 많은 클래스일수록 맞춤형성, 유연성이 떨어지고 기능이 전면적일수록 기본 클래스일수록 맞춤형성이 높지만 많은 방법과 기능은 개발자의 정의가 필요하다.
graphTB A[보기] -->B[보기 클래스] B[보기 클래스] -->C[Django 프레임워크 아래의 View] C{Django 프레임워크 아래의 View] C{Django 프레임워크 아래의 View] C{Django 프레임워크 아래의 View] C{D{Django 프레임워크 아래의 View] - 특성 2-->E[귀환방식 HttpResponnse/JSONReponse/Render/Redirecirect] C{[인수 인수 파라미터와 데이터 GETT/PReRerererererect] ---->>[보기 클래스] -->>>[보기 클래스] -->>[보기 클래스 [보기 클래스 보기 클래스] ---->>>>>[보기 클래스 [보기 클래스 [보기 클래스 [보기 클래스 보기] ---->GET 대신 데이터, POST 대신 데이터] F{APIView} - 특성 2-->H[반환 방식 Response, 데이터 렌더링] F{APIView} - - 계승자 -->I{GenericAPIView} I{GenericAPIView} - 특성 1->J[queryset과 필요한 구성 요소 클래스는 전역 변수 성명 방법 사이] I{GenericAPIView} - 특성 1-->K[구성 요소 기능의 실현은 필요에 따라 재방법에서 구체적으로 쓰여져 APIView와 큰 차이가 없음] A[시도] -> L[시도집] I{GenericAPIViewIL} - - - - - - - - - - - - - - - 계승자 - - - - - - - 그림 집합특성 1-->M[GenericAPIView의 모든 특성을 계승하였음] L{시투집합} - 특성 2-->N[as View가 리quest를 처리하는 방법명을 구별하였음] L{시투집합} -->O{GenericAPIIIIIView} O{GenerericViewiewSet} - 특성 2-->Q[ViewSetMixin] O{GenerererererericViewIuuquququququququququququququququequequeque를 처리하는 방법명]의 방법을 구별하여 처리하는 방법명 승계하는 방법 이름 승계하였음---------------------------------------------->Q[ViewSettt-->[ViewView승계계클래스, 재상속 R}- R-->T[보기 클래스에서 사용자 정의 처리 방법만 계승] S{사용 중 ViewSet Mixin의 클래스를 먼저 계승하고 R}을 계승한다. 둘 다 계승한다-->U[정의 방법은 필요 없고 전역 변수만 잘 쓰면 된다] S{사용 중 ViewSet Mixin의 클래스를 먼저 계승하고 R}---->V{ModelViewSet}V{ModelViewSet}에서 계승한다--특성 1-->W[ModelViewSet클래스만 계승한다] V{ViewSet1--X - 특성[계승류 후, 쓰기 방법이 필요 없고, 모든 방법이 봉인됨] V{ModelViewSet} - 단점-->Y[모든 방법은 봉인, 사용자 정의 불가] F{APIView} - 장점-->Z[수요에 따라 사용자 정의 가능]
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.