drf框架中全部視圖及用法

0909自我總結

drf框架中全部視圖及用法

一.drf框架中的全部視圖類

from django.views import View前端

from rest_framework import views, generics, mixins, viewsetspython

  • 最基礎:django自帶的views類django

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

  • drf框架中工具視圖:generics
    • GenericAPIView:該視圖類中的基類
  • mixins視圖工具集:
    • RetrieveModelMixin:retrieve 單取
    • ListModelMixin:list 羣取
    • CreateModelMixin:create 單增
    • UpdateModelMixin:update 單總體改
    • UpdateModelMixin: partial_update 單局部改
    • DestroyModelMixin:destroy 單刪
  • viewsets視圖集框架

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

二.viewsets視圖集

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

三.generics中GenericAPIView使用

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

  • self.get_queryset() :獲取全部url

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

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

    經常使用的幾個參數

    • 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, '刪除失敗')
相關文章
相關標籤/搜索