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為所有字段修改
使用這些方法的重要前提必須要
querysetserializer_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, '刪除失敗')
