drf框架中所有視圖及用法


0909自我總結

drf框架中所有視圖及用法

一.drf框架中的所有視圖類

from django.views import View

from rest_framework import views, generics, mixins, viewsets

  • 最基礎:django自帶的views類

  • drf框架中最基礎的視圖類:views.APIView

  • drf框架中工具視圖:generics

    • GenericAPIView:該視圖類中的基類
  • mixins視圖工具集:

    • RetrieveModelMixin:retrieve 單取
    • ListModelMixin:list 群取
    • CreateModelMixin:create 單增
    • UpdateModelMixin:update 單整體改
    • UpdateModelMixin: partial_update 單局部改
    • DestroyModelMixin:destroy 單刪
  • viewsets視圖集

上述視圖都是基於django自帶的views進行相關方法的分裝

二.viewsets視圖集

ViewSetMixin:視圖集工具 - 重寫as_view - 將 請求方式 映射到視圖類中的 指定方法
我們在路由中 類名.as_view({'get': 'retrieve', 'delete': 'remove_obj'})
GenericViewSet:與模型類有關的接口視圖集 - 可以從mixins那繼承功能,也可以自定義功能
ViewSet:與模型類無關或不是標准模型類接口 - 一般都是自定義功能

三.generics中GenericAPIView使用

將 queryset 和 serializer_class 封裝成類屬性,提供了三個方法

  • self.get_queryset() :獲取所有

  • self.get_object() :獲取根據pk獲取單個

  • self.get_serializer(*args, **kwargs):獲取指定

    常用的幾個參數

    • data:用於返序列化傳參
    • many:獲取多個序列化對象
    • instance:如果有后面save執行更新方法,沒有執行創建方法
    • partial:為True可以進行局部字段修改,默認為False為所有字段修改

使用這些方法的重要前提必須要

  • queryset
  • serializer_class
  • 如果我們要使用get_object()必須前端傳給我們一個pk

四.mixins使用

mixins是在generics再進行方法的分裝成5個方法

  • RetrieveModelMixin:retrieve 單取
  • ListModelMixin:list 群取
  • CreateModelMixin:create 單增
  • UpdateModelMixin:update 單整體改
  • UpdateModelMixin: partial_update 單局部改
  • DestroyModelMixin:destroy 單刪

使用方法都是self.方法名(request,*args,**kwargs)

如單取

首先我們要類進行繼承class 類名(mixins.RetrieveModelMixin)

self.retrieve(request,*args,**kwargs)

不過再執行這些操作的時候依然要給與generics視圖一樣的兩個參數,且創建的視圖類必須繼承其方法的類為父類

五.generics中繼承GenericAPIView的子類使用

class BookRetrieveUpdateAPIView(generics.RetrieveUpdateAPIView):
    queryset = models.Book.objects.filter(is_delete=False).order_by('-id')
    serializer_class = serializers.BookModelSerializer

其實再之前的基礎再進行方法的分裝

居然有什么方法看源碼即可ctrl+左鍵看源碼

六自定制視圖

本來get他就只會找類中get方法我們可以對其設置讓他找我們對於的名稱

路由層

from django.conf.urls import url
from . import views
urlpatterns = [
    url(r'^v4/books/(?P<pk>.*)/$', views.BookGenericViewSet.as_view({
        'delete': 'remove_book'
    })),
]

視圖層

class BookGenericViewSet(mixins.RetrieveModelMixin, mixins.ListModelMixin, mixins.CreateModelMixin, mixins.UpdateModelMixin, viewsets.GenericViewSet):
    queryset = models.Book.objects.filter(is_delete=False).order_by('-id')
    serializer_class = serializers.BookModelSerializer

    def remove_book(self, request, *args, **kwargs):
        pk = kwargs.get('pk')
        try:
            book_obj = models.Book.objects.get(is_delete=False, pk=pk)
            book_obj.is_delete = True
            book_obj.save()
            return APIResponse(0, '刪除成功')
        except:
            return APIResponse(1, '刪除失敗')


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM