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那继承功能,也可以@R_301_451@功能
ViewSet:与模型类无关或不是标准模型类接口 - 一般都是@R_301_451@功能
三.generics中GenericAPIView使用
将 queryset 和 serializer_class 封装成类属性,提供了三个方法
使用这些方法的重要前提必须要
queryset
serializer_class
- 如果我们要使用get_object()必须前端传给我们一个
pk
四.mixins使用
- RetrieveModelMixin:retrieve 单取
- ListModelMixin:list 群取
- CreateModelMixin:create 单增
- UpdateModelMixin:update 单整体改
- UpdateModelMixin: partial_update 单局部改
- DestroyModelMixin:destroy 单删
使用方法都是self.方法名(request,*args,**kwargs)
如单取
首先我们要类进行继承class 类名(mixins.RetrieveModelMixin)
self.retrieve(request,**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,**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,'删除失败')