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

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

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

      django restframework框架八 路由

      @(python之路)[django restframework框架八 路由]
      django restframework框架八 路由

      路由組件

      ?一般路由我們會寫六個方法:

      • 列表:SaView.get
      • 添加:SaView.post
      • 詳細:SaView.get
      • 修改:SaView.put
      • 局部:SaView.patch
      • 刪除:SaView.delete
        一般的路由都是有這六部分組成

      路由組件編寫

      a. 自定義路由

      urls.py

      
      from django.conf.urls import url
      from app01 import views
      urlpatterns = [
          url(r'sa/$', views.SaView.as_view()),
          url(r'sa/(?(pk)\d+)/$', views.SaView.as_view()),
      ]
      

      views.py

      class SaSerialiser(serializers.ModelSerializer):
          class Meta:
              model = models.Sa
              fields = "__all__"
      
      class SaView(APIView):
          authentication_classes = []
          def get(self,request,*args,**kwargs):
              pk = kwargs.get('pk')
              if not pk:
                  queryset = models.Sa.objects.all()
                  ser = SaSerialiser(instance=queryset,many=True)
              else:
                  obj = models.Sa.objects.filter(id=pk).first()
                  ser = SaSerialiser(instance=obj, many=False)
              return Response(ser.data)
      
          def post(self,request,*args,**kwargs):
              pass
      
          def put(self,request,*args,**kwargs):
              kwargs.get('pk')
              pass
      
          def patch(self,request,*args,**kwargs):
              kwargs.get('pk')
              pass
      
          def delete(self,request,*args,**kwargs):
              kwargs.get('pk')
              pass
      

      弊端:視圖函數做修改,這里也需要做修改

      b. 半自動路由

      urls.py

      
      from django.conf.urls import url
      from app01 import views
      urlpatterns = [
          url(r'sa/$', views.SaView.as_view({'get': 'list', 'post': 'create'})),
          url(r'sa/(?(pk)\d+)/$', views.SaView.as_view({'get': 'retrieve', 'put': 'update', 'patch': 'partial_update', 'delete': 'destroy'})),
      
      ]
      

      此時我們的views就要換一種方式了

      #!/usr/bin/env python
      # -*- coding:utf-8 -*-
      from rest_framework.viewsets import ModelViewSet
      from rest_framework import serializers
      from .. import models
      
      
      class UserSerializer(serializers.ModelSerializer):
          class Meta:
              model = models.UserInfo
              fields = "__all__"
      
      
      class UserViewSet(ModelViewSet):
          queryset = models.UserInfo.objects.all()
          serializer_class = UserSerializer
      

      c. 全自動路由

      urls.py

      from django.conf.urls import url, include
      from rest_framework import routers
      router = routers.DefaultRouter()
      router.register(r'sa', views.SaView)
      
      urlpatterns = [
      	url(r'^', include(router.urls)),
      ]
      

      views.py

      from rest_framework.viewsets import ModelViewSet
      from rest_framework import serializers
      from .. import models
      
      
      class UserSerializer(serializers.ModelSerializer):
          class Meta:
              model = models.UserInfo
              fields = "__all__"
      
      
      class UserViewSet(ModelViewSet):
          queryset = models.UserInfo.objects.all()
          serializer_class = UserSerializer
      
      

      不推薦這種方式

      源碼分析

      1

      from rest_framework.viewsets import GenericViewSet
      class SaView(APIView):
      	pass
      

      我們來看一下GenericViewSet

      class GenericViewSet(ViewSetMixin, generics.GenericAPIView):
          pass
      
      

      這里GenericViewSet繼承了ViewSetMixingenerics.GenericAPIView

      這里我們先看一下generics.GenericAPIView

      class GenericAPIView(views.APIView):
          queryset = None
          serializer_class = None
          lookup_field = 'pk'
          lookup_url_kwarg = None
          filter_backends = api_settings.DEFAULT_FILTER_BACKENDS
          pagination_class = api_settings.DEFAULT_PAGINATION_CLASS
      
      
          def get_queryset(self):
              assert self.queryset is not None, (
                  "'%s' should either include a `queryset` attribute, "
                  "or override the `get_queryset()` method."
                  % self.__class__.__name__
              )
      		# 這里的本質就是 self.queryset= queryset = None;
      		# 這里單純的它是沒有意義的。我們需要結合其他的來用。他是用來調用增刪改查的。稍后會仔細說。
              queryset = self.queryset
              if isinstance(queryset, QuerySet):
                  # Ensure queryset is re-evaluated on each request.
                  queryset = queryset.all()
              return queryset
      
      

      ?我們現在來看,GenericAPIView并沒有起到什么作用。所以我們繼續看ViewSetMixin。

      class ViewSetMixin(object):
          @classonlymethod
          def as_view(cls, actions=None, **initkwargs):
      	    pass
      

      我們關注的是as_view()他這里需要重新寫了as_view方法。所以我們的路由也要跟著改變。語言來的變化請看b

      2
      ModelViewSet:代碼示例請看c

      class ModelViewSet(mixins.CreateModelMixin,
                         mixins.RetrieveModelMixin,
                         mixins.UpdateModelMixin,
                         mixins.DestroyModelMixin,
                         mixins.ListModelMixin,
                         GenericViewSet):
          pass
      

      我們發現他繼承了五個類,

      posted @ 2018-06-07 10:46  zz小公子  閱讀(198)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 亚洲中文字幕人成影院| 亚洲成A人片在线观看的电影| 国产精品老年自拍视频| 蜜桃久久精品成人无码av| 成人国产精品免费网站| 亚洲男人AV天堂午夜在| 国产精品一区二区久久精品| 亚洲AV成人无码精品电影在线| 亚洲国产成人精品av区按摩| 好吊视频专区一区二区三区| 苍井空浴缸大战猛男120分钟 | 苍梧县| 中文字幕无码色综合网| 十八禁国产精品一区二区| 国产破外女出血视频| 久久午夜无码免费| 国产无遮挡免费真人视频在线观看| 小雪被老外黑人撑破了视频| 熟妇无码熟妇毛片| 亚洲男人第一无码av网站| 日本丰满的人妻hd高清在线| 成年午夜免费韩国做受视频| 精品国产一区AV天美传媒| 中文字幕人妻日韩精品| 亚洲国产成人自拍视频网| 亚洲精品乱码久久久久久自慰| 国产高清在线精品一本大道| 国产高清在线A免费视频观看| 无码h片在线观看网站| 四虎永久免费精品视频| 亚洲av永久无码精品天堂久久| 色综合久久精品中文字幕| 久久中文字幕无码一区二区| 亚洲男人的天堂一区二区| 亚洲人成网网址在线看| 国产91午夜福利精品| 亚洲中文字幕一区二区| 97超级碰碰碰碰久久久久| 国产精品一区中文字幕| 亚洲一区精品视频在线| 日韩国产成人精品视频|