1. 程式人生 > >django-rest-framework檢視層的使用(二)

django-rest-framework檢視層的使用(二)

上一章節我們講了serializers層的各種寫法,本章介紹view層的寫法

一、使用APIView的寫法見上一章節

二、使用mixinsgenerics書寫檢視層

  • 1、serializers保持用GoodsSerializersModel
  • 2、書寫檢視層

    from rest_framework import status, mixins, generics
    class GoodsListViewModelTwo(mixins.ListModelMixin, generics.GenericAPIView):
        """
        queryset就是這樣寫的
        serializer_class就是這樣寫的
        """
    queryset = Goods.objects.all()[:10] serializer_class = GoodsSerializersModel def get(self, request, *args, **kwargs): return self.list(request, *args, **kwargs)
  • 3、url配置保持不變

三、使用ListAPIView來寫

  • 1、serializers保持用GoodsSerializersModel
  • 2、書寫檢視層

    class GoodsListViewModelTwo(generics.ListAPIView)
    :
    queryset = Goods.objects.all()[:10] serializer_class = GoodsSerializersModel
  • 3、url配置保持不變

四、分頁的配置

  • 1、在setting.py中配置一頁顯示多少條資料(別的都保持不變)

    
    # 配置分頁顯示
    
    REST_FRAMEWORK = {
        'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination',
        'PAGE_SIZE': 10
    }

五、使用viewsets

  • 1、檢視層的書寫

    from rest_framework import status, mixins, generics, viewsets
    class GoodListViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):
        queryset = Goods.objects.all()
        serializer_class = GoodsSerializersModel
  • 2、url.py的配置

    goods_list = GoodListViewSet.as_view({
        'get': 'list',
        # 'post': 'create'
    })
    urlpatterns = [
        url(r'^goods3/$', goods_list),
    ]

六、viewsetsrouter結合使用

  • 1、檢視不變
  • 2、配置url變化

    from rest_framework.routers import DefaultRouter
    router = DefaultRouter()
    
    # 註冊一個url地址
    
    router.register(r'goods3', GoodListViewSet)
    urlpatterns = [
        url(r'^', include(router.urls)),
        url(r'^xadmin/', xadmin.site.urls),
        url(r'^api-auth/', include('rest_framework.urls')),
        url(r'docs/', include_docs_urls(title='介面測試學習'))
    ]

七、上面分頁是在settings.py檔案中配置的,是會影響整個專案全部的檢視,如果僅僅是在一個檢視中使用分頁可以考慮在檢視中自己定義

  • 1、註釋配置檔案中的分頁
  • 2、在檢視中寫一個類用於分頁配置

    from rest_framework.pagination import PageNumberPagination
    class UserPagination(PageNumberPagination):
        """
        自己定義一個使用者分頁的類
        """
        page_size = 5  # 每頁顯示多少條數
        page_size_query_param = 'page_size'
        page_query_param = "page"
        max_page_size = 100
    
    
    class UserViewSet(viewsets.ModelViewSet):
        """
        關於使用者的
        """
        queryset = UserModel.objects.all()
        serializer_class = UserSerializer
        # 使用分頁
        pagination_class = UserPagination

八、關於使用viewsets.ModelViewSet的操作

  • 1、檢視原始碼這個類繼承了的類

    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
  • 2、使用後我們檢視中直接使用就可以(預設是支援get和post)

    class BlogViewSet(viewsets.ModelViewSet):
        """
        關於部落格的
        """
        queryset = Blog.objects.all()
        serializer_class = BlogSerialzer
  • 3、如果需要修改或者刪除資料可以重寫

    class BookViewSet(viewsets.ModelViewSet):
        queryset = Book.objects.all()
        serializer_class = BookSerializer
    
        # 查詢全部資料
        def get(self, request, *args, **kwargs):
            return self.list(request, args, kwargs)
    
        # 新增資料
        def post(self, request, *args, **kwargs):
            return self.create(request, *args, **kwargs)
    
        # 修改資料
        def patch(self, request, *args, **kwargs):
            return self.update(request, *args, **kwargs)
    
        # 刪除資料
        def delete(self, request, *args, **kwargs):
            return self.destroy(request, *args, **kwargs)
  • 3、如果僅僅是需要get功能可以繼承

    class BookViewSet(mixins.ListModelMixin, viewsets.GenericViewSe):
        pass

九、關於個人總結

  • 1、第八點中我們在views.py中使用了viewsets.ModelViewSet,雖然簡單好用,但是在開發中往往會有壁壘,比如我僅僅是要get請求…
  • 2、個人建議使用mixins.CreateModelMixin等一起來使用
  • 3、如果是get請求可以繼承mixins.ListModelMixin, mixins.RetrieveModelMixin, viewsets.GenericViewSet
  • 4、如果是post提交可以是mixins.CreateModelMixin, viewsets.GenericViewSet
  • 5、如果需要修改資料是mixins.UpdateModelMixin,viewsets.GenericViewSet
  • 6、如果是刪除資料是mixins.DestroyModelMixin,viewsets.GenericViewSet
  • 7、比如get請求,檢視原始碼,我們可以重寫retrieve這個方法

    class AuthorViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, viewsets.GenericViewSet):
        queryset = Author.objects.all()
        serializer_class = AuthorSerializer
    
        def list(self, request, *args, **kwargs):
            // 獲取引數
            print(self.request.query_params['name'])
            queryset = self.filter_queryset(self.get_queryset().filter(author=self.request.query_params['name']))
    
            page = self.paginate_queryset(queryset)
            if page is not None:
                serializer = self.get_serializer(page, many=True)
                return self.get_paginated_response(serializer.data)
    
            serializer = self.get_serializer(queryset, many=True)
            return Response(serializer.data)
  • 8、mixins.ListModelMixin是獲取列表的

  • 9、mixins.RetrieveModelMixin可以獲取詳情

相關推薦

django-rest-framework檢視的使用()

上一章節我們講了serializers層的各種寫法,本章介紹view層的寫法 一、使用APIView的寫法見上一章節 二、使用mixins和generics書寫檢視層 1、ser

Django Rest Framework 檢視和路由

一、DRF的檢視 (一)APIView APIView是REST framework提供的所有檢視的基類,繼承自Django的View父類。 APIView與View的不同之處在於: 傳入到檢視方法中的是REST framework的Request物件,而不是Django的HttpRequese

檢視元件,路由元件 Django Rest Framework 檢視和路由

檢視元件  -- 第一次封裝   -- GenericAPIView(APIView):    queryset = None    serializer_class = None

學習筆記-Python-Django REST Framework-檢視

- 檢視 - DRF的檢視從處理任務,處理流程等跟Django基本一致 - 此檢視基本是Django檢視的擴充套件 - Request - 把請求解析成一個request例項 - 屬於DRF的,跟Django的HttpRequest不太一樣

Django Rest Framework源碼剖析()-----權限

www. 基於 framework suffix 生效 ted AI try exce 一、簡介 在上一篇博客中已經介紹了django rest framework 對於認證的源碼流程,以及實現過程,當用戶經過認證之後下一步就是涉及到權限的問題。比如訂單的業務只

Django REST framework+Vue 打造生鮮電商項目(筆記

開始 allow 動作 false 做到 category gef eric ocs (轉自https://www.cnblogs.com/derek1184405959/p/8768059.html)(有修改) 接下來開始引入django resfulframework,

Django rest framework 權限操作(源碼分析)

prop 源碼 display rtc body app ffi 代碼 tin 知識回顧 這一篇是基於上一篇寫的,上一篇謝了認證的具體流程,看懂了上一篇這一篇才能看懂, 當用戶訪問是 首先執行dispatch函數,當執行當第二部時: #2.處理版本信息

Django rest framework 許可權操作(原始碼分析)

知識回顧  這一篇是基於上一篇寫的,上一篇謝了認證的具體流程,看懂了上一篇這一篇才能看懂, 當用戶訪問是 首先執行dispatch函式,當執行當第二部時: #2.處理版本資訊 處理認證資訊 處理許可權資訊 對使用者的訪問頻率進行限制 self

django rest framework檢視

在之前的django rest framework其他元件中,在檢視函式中繼承類都是rest_framework.view.APIView,這個APIView是繼承的django中的View並且做了封裝和方法重寫的。 那麼在django rest framework中,還有有沒有提供其他的類能夠繼承? 一、

django rest framework框架中的檢視都可以繼承哪些類?

#class View(object): #class APIView(View): 封裝了view,並且重新封裝了request,初始化了各種元件 #class GenericAPIView(views.APIView): #1.增加了一些屬性和方法,如get_queryset,get_seria

django rest framework 解析器元件 介面設計,檢視元件 (1)

一.解析器元件 -解析器元件是用來解析使用者請求資料的(application/json), content-type 將客戶端發來的json資料進行解析 -必須適應APIView -request.data觸發 二.序列化元件 2.1.django 自帶元件serializer 2.1.1 fr

django rest framework 解析器元件 介面設計,檢視元件 (2)

1. 使用檢視元件進行介面優化 1.1 使用檢視元件的mixin進行介面邏輯優化 - 匯入mixin from rest_framework.mixinx import ( ListModelMix, CreateModelMixin,

Django REST Framework學習-分頁,通用檢視,自定義RelatedField

使用通用檢視+分頁+自定義RelatedField url:cardusers/pk/ 傳入模型Card的pk,獲取當前Card的所有User中username和頭像avatar,User是avatar的外來鍵 1. 過載ListAPIView,加入分頁 class

Django REST framework教程: 請求和響應

教程索引目錄 Django REST framework的系列教程 對於需要通篇瞭解的同學,可以點選教程索引目錄。 從現在開始,我們要開始,真正接觸到REST framework的核心部分了。當然,我們需要先認識一些重要的基本元素。 請求物件(R

DRF(Django REST framework)Mixin中的檢視的五個擴充套件類

這五個擴充套件類需要搭配GenericAPIView父類,因為五個擴充套件類的實現需要呼叫GenericAPIView提供的序列化器與資料庫查詢的方法 1)ListModelMixin 列表檢視擴充套件類,提供list(request, *args, **k

Django rest framework 常用外來鍵命令 (加入、刪除、檢視所有、檢視除了自己以外的所有、摘除分離物件間外來鍵關係)

依次介紹:加入、刪除、檢視所有、檢視除了自己以外的所有、摘除分離物件間外來鍵關係 model class MyUser(AbstractUser): team=models.ForeignKey('myteam.Team',related_name=

Django REST framework教程三: 基於類的檢視

教程索引目錄 Django REST framework的系列教程 對於需要通篇瞭解的同學,可以點選教程索引目錄。 其實,與其使用基於方法(function based)的檢視,我們更加傾向使用基於類(class based)的檢視。接下來,你將看到這

DRF Django REST framework 之 解析器(

引入 Django Rest framework幫助我們實現了處理application/json協議請求的資料,如果不使用DRF,直接從 request.body 裡面拿到原始的客戶端請求的位元組資料,經過 decode ,然後 json 反序列化

DRF Django REST framework檢視元件(四)

引言 在我們有幾十上百的檢視類,都有get,post等方法,在功能類似時,會導致大量的重複程式碼出現,顯然還有很多可以優化的地方。這也就有了檢視元件,它的功能非常強大,能很好的優化介面邏輯。 檢視元件 使用檢視元件的mixin優化介面邏輯 匯入 mixins  定義序列化類 定義檢視類

Django REST framework 的快速入門教程

ret turn ads 使用 blog 所有 定義 想去 cti CRM-API項目搭建 序列器(Serializers) 首先,我們來定義一些序列器。我們來創建一個新的模塊(module)叫做 crm/rest_searializer.py ,這是我們用來描述數據是如何