보기 클래스와 보기 집합의 기본 사용

8651 단어
보기 클래스와 뷰 세트 사용
1. 뷰 클래스: View, APIView, GenericAPIView
View는 Django에서 제공하는 보기 클래스입니다. 클래스의 반환 값은Http Response, JSON Response에 필요합니다.
(1), APIView
Django에서 정의한 뷰를 상속하지만 뷰와는 두 가지 차이가 있습니다.
  • 데이터를 되돌려주는 데 drf 프레임워크의 Response
  • 가 사용됩니다.
  • 데이터 처리에서queryGET 대신 params, POST 대신 데이터
  • #        
    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 방식 ':' 방법 이름'}) 안에 있습니다.뷰 세트는 뷰 클래스의 두 가지 문제를 해결합니다.
  • 요청 방식이 충돌하는 문제: 보기에서 get 요청을 집중하면 모든 데이터, 즉 데이터 목록을 얻을 수 있고 단일 데이터, 즉 데이터의 상세한 정보를 얻을 수 있어 혼란을 초래하기 쉽다
  • url 충돌: 보기 클래스에 Pk가 있는 것과 Pk 파라미터가 없는 처리 클래스는 다르다. 두 개의 보기 클래스를 사용하여 두 개의 클래스를 각각 url를 만들어야 한다. 보기 집중은 보기 클래스 하나만 만들면 해결할 수 있고 보기 집합의 사용에서 로터 클래스를 호출하여 url를 관리할 수 있어 url의 혼란을 잘 해결할 수 있다.

  • (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의 다섯 가지 확장 클래스
  • ListModelMixin: 이 확장 클래스의 기능은 데이터 목록을 가져오는 것이다
  • RetrieveModelMixin: 이 확장 클래스의 기능은 특정한 데이터의 상세한 정보를 얻는 것이다
  • CreateModelMixin: 이 확장 클래스의 기능은 데이터베이스에 데이터를 만드는 것이다
  • Update Model Mixin: 이 확장 클래스의 기능은 데이터베이스에서 데이터를 업데이트하는 것이다
  • DestroyModelMixin: 이 확장 클래스의 기능은 데이터베이스에서 지정한 데이터를 삭제하는 것이다
  • 4. 보기 클래스와 보기 집합의 관계도
    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[수요에 따라 사용자 정의 가능]

    좋은 웹페이지 즐겨찾기