• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • Django之DRF框架學習(Django REST framework)——視圖集

    標簽: 后端  Python  django  api

    介紹ViewSet

    • list() 提供一組數據
    • retrieve() 提供單個數據
    • create() 創建數據
    • update() 保存數據
    • destory() 刪除數據

    ViewSet視圖集不再實現get(),post()等方法,而是實現動作action如list(),create()等。視圖集只在使用as_view()方法的時候,才會將action動作與具體請求方式對應上。

    視圖集存在的意義:

    1. 將所有的接口可以寫在一個類試圖中(類試圖中的方法不再用請求方法名小寫 行為/動作 list/create)
    2. 重寫了as_view({‘get’:‘list’, ‘post’:‘create’})

    使用ViewSet開發api案例

    1.views.py

    '''使用試圖集的ViewSet開發api'''
    
    class BookViewSet(ViewSet):
        def list(self, request):
            qs = BookInfo.objects.all()
            serializer = BookInfoModelSerializer(instance=qs, many=True)
            return Response(serializer.data)
    
        def retrieve(self, request, pk):
            try:
                book = BookInfo.objects.get(id=pk)
            except BookInfo.DoesNotExist:
                Response(status=status.HTTP_404_NOT_FOUND)
            serializer = BookInfoModelSerializer(instance=book)
            return Response(serializer.data)
    

    2.urls.py

    from django.conf.urls import url
    from . import views
    
    # 視圖集路由
        url(r'^books/$', views.BookViewSet.as_view({'get':'list'})),
        url(r'^books/(?P<pk>\d+)$', views.BookViewSet.as_view({'get':'retrieve'}))
    

    使用使用GenericViewSet + Mixin開發api案例

    1.views.py

    from booktest.models import BookInfo,HeroInfo
    from .serializers import BookInfoModelSerializer,HeroInfoModelSerializer
    from rest_framework.mixins import ListModelMixin,CreateModelMixin,DestroyModelMixin,UpdateModelMixin,RetrieveModelMixin
    from rest_framework.viewsets import ViewSet,GenericViewSet,ReadOnlyModelViewSet,ModelViewSet
    
    '''使用GenericViewSet + Mixin開發api'''
    class BookViewSet( DestroyModelMixin, CreateModelMixin, UpdateModelMixin, ReadOnlyModelViewSet):
        queryset = BookInfo.objects.all()
        serializer_class =  BookInfoModelSerializer
    

    附加viewsset的部分源碼,其實ReadOnlyModelViewSet 包含了 GenericViewSet 與 ListModelMixin 與 RetrieveModelMixin

    class ViewSet(ViewSetMixin, views.APIView):
        """
        The base ViewSet class does not provide any actions by default.
        """
        pass
    
    
    class GenericViewSet(ViewSetMixin, generics.GenericAPIView):
        """
        The GenericViewSet class does not provide any actions by default,
        but does include the base set of generic view behavior, such as
        the `get_object` and `get_queryset` methods.
        """
        pass
    
    
    class ReadOnlyModelViewSet(mixins.RetrieveModelMixin,
                               mixins.ListModelMixin,
                               GenericViewSet):
        """
        A viewset that provides default `list()` and `retrieve()` actions.
        """
        pass
    
    
    1. urls.py
    from django.conf.urls import url
    from . import views
    # 視圖集路由
    url(r'^books/$', views.BookViewSet.as_view({'get':'list', 'post': 'retrieve'})),
    url(r'^books/(?P<pk>\d+)$', views.BookViewSet.as_view({'get':'retrieve', 'delete':'destroy', 'put':'update'}))
    

    最牛逼的一種開發api方式(使用ModelViewSet + 自動注冊路由)

    1. views.py
    '''最叼繼承 ModelViewSet'''
    class BookViewSet( ModelViewSet):
        queryset = BookInfo.objects.all()
        serializer_class =  BookInfoModelSerializer
    
    1. urls.py
    from rest_framework.routers import DefaultRouter
    urlpatterns = [
        
    ]
    router = DefaultRouter()   # 創建路由器
    router.register(r'book', views.BookViewSet)  #注冊路由
    urlpatterns += router.urls
    

    自定義視圖(自己定義的邏輯)

    1.views.py

    @action(methods=[指定下面的行為接受什么請求], detail=是不是詳情視圖,詳情視圖為True,生成路由books/pk/latest,列表視圖為False,生成路由books/latest)

    from booktest.models import BookInfo,HeroInfo
    from .serializers import BookInfoModelSerializer,HeroInfoModelSerializer
    from rest_framework.viewsets import ViewSet,GenericViewSet,ReadOnlyModelViewSet,ModelViewSet
    
    # 用于urls.py自動創建自定義視圖的路由
    from rest_framework.decorators import action
    class BookViewSet( ModelViewSet):
        queryset = BookInfo.objects.all()
        serializer_class =  BookInfoModelSerializer
    
        @action(methods=['get'], detail=False)
        def latest(self, request):
            book = BookInfo.objects.latest('id')
            serializer = self.get_serializer(book)
            return Response(serializer.data)
    
        @action(methods=['put'], detail=True)
        def read(self, request, pk):
            '''修改圖書的數量'''
            book = self.get_object()
            book.bread = request.data.get('bread')
            book.save()
            serializer = self.get_serializer(book)
            return  Response(serializer.data)
    

    2.urls.py

    創建路由器(!!!路由器只可以結合試圖集一塊用!!!)默認只生成標準的增刪改查,如果想生成自定義的路由需要在views.py的自定義視圖上添加裝飾器action(from rest_framework.decorators import action)
    !!!路由器只可以結合試圖集一塊用!!!
    !!!路由器只可以結合試圖集一塊用!!!
    !!!路由器只可以結合試圖集一塊用!!!

    from rest_framework.routers import DefaultRouter,SimpleRouter
    urlpatterns = [
        
    ]
    router = DefaultRouter()   # 創建路由器
    router.register(r'book', views.BookViewSet, base_name='bookinfo')  #注冊路由
    urlpatterns += router.urls
    

    DefaultRouter與SimpleRouter的區別: DefaultRouter可以自動生成根視圖不報錯

    謝謝觀看~

    在這里插入圖片描述

    版權聲明:本文為Seven597原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/Seven597/article/details/110685593

    智能推薦

    Django Rest_Framework(DRF)

    文章目錄 一、主要內容 1、web開發模式 2、API接口 3、接口測試工具:Postman 4、序列化 5、Restful規范(重點) 6、Django Rest_Framework(drf) 7、drf環境安裝與配置 7.1 安裝DRF 7.1.1 創建django項目 7.2 添加rest_framework應用 7.3 體驗drf完全簡寫代碼的過程(了解) 7.3.1. 創建模型操作類 7...

    Django REST framework - View 視圖

    APIView APIView是rest framework中最常用也是最基本的一個視圖。APIView繼承自Django的View視圖,并對Django的原生request進行了一些封裝,主要封裝了驗證、權限、節流三部分。 先看一下APIView中驗證、權限、節流的流程是怎樣的 驗證 rest framework提供了一個驗證的基類與4個驗證類 如果想要自己實現驗證方法,可以通過繼承BaseAu...

    Django rest framework之視圖組件

    文章目錄 1、視圖組件 1.1、作用 1.2、視圖繼承關系 1.3、視圖的方法與屬性 2、2個視圖基類 2.1、APIView 2.1.1、APIView與View的不同之處 2.1.2、支持定義的類屬性 2.2、GenericAPIView[通用視圖類] 2.2.1、屬性 2.2.1.1、serializer_class 指明視圖使用的序列化器 2.2.2、方法 2.2.2.1、get_seri...

    Django之Rest Framework

    Rest Framework Rest Framework是前后端分離中的一種規范,它與框架本身無關,是一種軟件架構風格,全稱為Representational State Transfer。 Rest Framework最顯著的特點就是將一切數據看作資源,同時對不同的請求方式做出不同的責任劃分。這種結構理念也被稱為面向資源架構。 前后端分離 不同于前后端混合開發中的接口,API接口主要用于為頁面...

    django rest framework學習

    1. 引入DjangoRESTframework 1.1 Web應用模式 前后端不分離 前后端分離 1.2 認識RESTful 在前后端分離的應用模式里,API接口如何定義? 對于接口的請求方式與路徑,每個后端開發人員可能都有自己的定義方式,風格迥異。 是否存在一種統一的定義方式,被廣大開發人員接受認可的方式呢? 這就是被普遍采用的API的RESTful設計風格。 例如對于后端數據庫中保存了商品的...

    猜你喜歡

    HTML中常用操作關于:頁面跳轉,空格

    1.頁面跳轉 2.空格的代替符...

    freemarker + ItextRender 根據模板生成PDF文件

    1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...

    電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!

    Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...

    requests實現全自動PPT模板

    http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...

    精品国产乱码久久久久久蜜桃不卡