<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      DRF視圖

      Posted on 2022-11-27 21:35  呱呱呱呱嘰里呱啦  閱讀(23)  評論(0)    收藏  舉報

      DRF視圖

      請求

      # 見源碼
      

      響應

      # Response()參數:
      # data,即要返回的數據,字典格式
      # status,返回的狀態碼
      # template_name,即自定義模板
      # headers,即響應頭,可增加數據
      # content_type,即響應編碼
      # 根據請求的user_agent區別響應,可以配置,如無則使用默認配置
      
      
      # 局部配置:對某個視圖類有效
      # 在視圖類中先加入:
      renderer_classes=[JSONRenderer,]
      
      
      # 全局配置:對所有視圖類都有效
      # 在settings.py中加入:
      REST_FRAMEWORK = {
          'DEFAULT_RENDERER_CLASSES': ['rest_framework.renderers.JSONRenderer']
      }
      
      # drf配置信息查找順序:先視圖類,后項目配置文件,最后默認配置
      

      視圖

      # 視圖基類:ModelViewSet(>GenericViewSet)>GenericAPIView>APIView>View
      

      APIView

      # 注冊rest_framework
      
      # 在models.py中定義表模型
      class Book(models.Model):
          id = models.AutoField(primary_key=True)
          name = models.CharField(max_length=32)
          price = models.DecimalField(max_digits=6,decimal_places=2)
          author = models.CharField(max_length=32)
          public = models.CharField(max_length=64)
      
      # 在自定義文件中定義序列化器
      from rest_framework import serializers
      
      
      class BooksSerializer(serializers.Serializer):
          name = serializers.CharField()
          price = serializers.DecimalField(max_digits=6,decimal_places=2)
          author = serializers.CharField()
          public = serializers.CharField()
      
      # 在views中定義視圖類
      class BookView(APIView):
          def get(self,request,id):
              book = Book.objects.filter(id=id).first()
              book_ser = BooksSerializer(book) # 參數就是要序列化的對象
              # book_ser.data就是序列化后的字典
              return Response(book_ser.data) # 也可以用JsonResponse返回,這樣不用注冊rest_framework,但不能通過判斷請求信息區別渲染
      
      # 配置路由信息
      

      GenericAPIView

      class BookDetailView(GenericAPIView):
          # queryset = Book.objects.all() # 查詢所有
          # serializer_class = BookSerializer # 傳入自定義序列器
          # 
          # 之后的內部視圖函數就可以使用self.get_queryset()、self.get_object()和self.get_serializer()方法,使用self.get_object(),需要路由配置中有名分組必須命名為pk,或者視圖類中配置lookup_url_kwarg屬性
      
      # 這種方式是可以將查詢或者操作資源需要的query對象或者序列器封裝到self.中,在之后創建類似的其他表模型的視圖函數只需要復制視圖類,修改類名及類名中的queryset、serializer_class參數即可
      
      # 但是這樣會造成代碼重復,所以可以引入已經寫好的5個類:
      from rest_framework.mixins import ListModelMixin,CreateModelMixin,UpdateModelMixin,DestroyModelMixin,RetrieveModelMixin
      class BookDetailView(GenericAPIView):
          def get(self,request):
              return self.list(request)
          def post(self,request):
              return self.create(request)
      

      GenericAPIView的視圖子類9個

      from rest_framework.generics import CreateAPIView,ListAPIView,DestroyAPIView,UpdateAPIView,RetrieveAPIView,ListCreateAPIView,RetrieveUpdateAPIView,RetrieveDestroyAPIView,RetrieveUpdateDestroyAPIView # 繼承了GenericAPIView,基于基本5種組合而來
      
      class Book(CreateAPIView,ListAPIView):
          queryset = Book.objects.all()
          serializer_class = BookSerializer
      # 以上即所有代碼
      

      ModelViewSet(ReadOnlyModelViewSet)

      class ModelViewSet(mixins.CreateModelMixin,
                         mixins.RetrieveModelMixin,
                         mixins.UpdateModelMixin,
                         mixins.DestroyModelMixin,
                         mixins.ListModelMixin,
                         GenericViewSet):
          """
          A viewset that provides default `create()`, `retrieve()`, `update()`,
          `partial_update()`, `destroy()` and `list()` actions.
          """
          pass
      # 繼承ModelViewSet創建視圖類,多個路由將指向同一個視圖類,這時需要指定.as_view()方法中的actions參數,實際上GenericViewSet繼承的ViewSetMixin類中重寫了.as_view()方法。
      

      源碼

      # ModelViewSet>GenericViewSet>ViewSetMixin>as_view>view
      for method, action in actions.items():
          handler = getattr(self, action)
          setattr(self, method, handler)
      # 循環解壓路由傳來的actions參數,并為視圖類對象的相應方法綁定已經寫好的方法的內存地址
      

      ViewSetMixin使用

      通過源碼,我們看到ViewSetMixin中重寫的as_view方法非常快樂,所以我們可以在繼承APIView、GenericAPIView創建視圖類時直接先繼承ViewSetMixin來借用

      這樣可以多個路由指向我們同一個視圖類,并且手動配置請求方式和視圖類中函數的對應關系

      視圖類匯總

      兩個視圖基類:APIView、GenericAPIView

      五個視圖拓展類(直接繼承object類):ListModelMixin,CreateModelMixin,UpdateModelMixin,DestroyModelMixin,RetrieveModelMixin

      九個視圖子類(繼承GenericAPIView和五個視圖拓展類中的一個或多個):CreateAPIView,ListAPIView,DestroyAPIView,UpdateAPIView,RetrieveAPIView,ListCreateAPIView,RetrieveUpdateAPIView,RetrieveDestroyAPIView,RetrieveUpdateDestroyAPIView

      五個視圖集:GenericViewSet、ModelViewSet、

      ReadOnlyModelViewSet、ViewSet、ViewSetMixin

      ModelViewSet:五個接口全

      GenericViewSet:GenericAPIView+ViewSetMixin

      ViewSet:APIView+ViewSetMixin

      ViewSetMixin:重寫as_view()方法,可以在路由中用actions直接配置請求方式和視圖類中具體視圖函數的對應關系,手動配置或者使用Router自動配置,當視圖類中自定義了視圖函數時,可以在視圖函數前用@action裝飾器,action的參數有methods=[GET,POST]、detail=True,則生成的路由中配置了有名分組pk,需要'/1/get_2'類似的請求,且函數應添加形參pk

      主站蜘蛛池模板: 国产另类ts人妖一区二区| 精品国际久久久久999波多野| 国产在线精品一区二区三区直播| 亚洲精品岛国片在线观看| 热久久这里只有精品国产| 午夜无码国产18禁| 亚洲av永久无码精品漫画| 人人澡超碰碰97碰碰碰| 韩国免费A级毛片久久| 国产无吗一区二区三区在线欢 | 亚洲欧洲日产国产av无码| 亚洲av综合色区在线观看| 国产一区二区三区禁18| 国产a在视频线精品视频下载| 国产国语毛片在线看国产| 日韩最新中文字幕| 日韩国产精品无码一区二区三区| 久久国产精品老人性| 久久夜色精品国产亚av| 泰安市| 色诱视频在线观看| 成人国产精品一区二区网站公司| 国内不卡不区二区三区| 欧美牲交a欧美牲交aⅴ免费真| 扒开粉嫩的小缝隙喷白浆视频| 中文字幕人妻中出制服诱惑| 99国产精品欧美一区二区三区| 国产成人a∨激情视频厨房| 亚洲国产精品热久久一区| 久热这里只有精品12| av永久免费网站在线观看| 久青草视频在线免费观看| 无码人妻精品一区二区三区夜夜嗨| 秋霞人妻无码中文字幕| 亚洲香蕉网久久综合影视| 曰韩无码av一区二区免费| 国产在线午夜不卡精品影院| 人妻蜜臀久久av不卡| 色达县| 国产午夜成人久久无码一区二区| 又粗又紧又湿又爽的视频|