Drf视图集合
作者:互联网
1.背景:
技术储备,drf适合前后端分离项目,比较适合单表操作的业务,另外丰富的视图集合配合路由自动生成,开发速度能得到极大的提升。
2、视图分类:
2.1:视图超类:
from rest_framework.views import APIView
from rest_framework.generics import GenericAPIView
APIView | 继承与原生的Django的view,重写了as_view 和 dispatch方法 |
GenericAPIView | 继承与APIView,提供了三个属性(queryset、serializer_class、lookup_field)以及三个方法(get_queryset、get_serializer、get_obj) |
2.2:视图工具类(mixin):
此工具类需要配合 GenericAPIView 不能单独使用,需要在视图中重写 get、post等方法
from rest_framework import mixins
CreateModelMixin | 单增工具类——实现create方法 |
ListModelMixin | 群查工具类——实现list方法 |
RetrieveModelMixin | 单查工具类——实现retrieve方法 |
UpdateModelMixin | 单整体局部改工具类——实现update方法 |
DestoryModelMixin | 单删工具类——实现destory方法 |
2.3:工具视图类(generics):
其实继承与 GenericAPIView、 mixin(子类),由于mixin的子类不能单独使用,需要配合 GenericAPIView,等于是GenericAPIView任意组合了mixin子类,并且重写了实现方法(可能一对一,可能一对多),共9个
序号 |
类名 |
备注 |
1 |
CreateAPIView |
创建数据,对应post,只实现了CreateModelMixin.create方法 |
2 |
ListAPIView |
查询全部数据,对应get,只实现了ListModelMixin.list方法 |
3 |
DestroyAPIView |
删除数据,对应delete,只实现了DestoryModelMixin.destory 方法 |
4 |
UpdateAPIView |
更新数据,对应put,只是实现了 UpdateModelMixin.update 方法 |
5 |
RetrieveAPIView |
查询单条数据,对应get,只是实现了RetrieveModelMixin.retrieve 方法 |
6 |
RetrieveUpdateAPIView |
对应 get、put,实现了 4--5 |
7 |
ListCreateAPIView |
对应 get、post,实现了 1--2 |
8 |
RetrieveDestroyAPIView |
对应 get、delete,实现了 5--3 |
9 |
RetrieveUpdateDestroyAPIView |
对应 get、delete,put ,实现了 5--3--4 |
2.4:视图集合
from rest_framework.views import ModelViewSet
ModelViewSet 视图大集合 实际上继承了mixins 以及 GenericViewSet ,GenericViewSet不等于 GenericAPIView,GenericViewSet实际继承了 ViewSetMixin 然后这个类重写了as_view方法,直接或者间接继承ViewSetMixin必须指定action 例如as_VIEW({"get":"get_all"})
class ActionModeViewSetDemo(ModelViewSet): queryset = Book.objects.all() serializer_class = BookModelSerializer # detail 只有 true 和false 2种 detail =True 则生成路径中带 pk 的 否则生成正常的 # 在路由中生成 并且 detail是false # ^booksaction/get_all/$ [name='booksviewset-get-all'] # ^booksaction/get_all\.(?P<format>[a-z0-9]+)/?$ [name='booksviewset-get-all'] @action(methods=["get","post"],detail=False) def get_all(self,request): book = self.get_queryset()[:2] ser = self.get_serializer(book,many=True) return Response({"code":100,"msg":"success","result":ser.data}) # detail = True 则生成带pk的 # booksaction/(?P<pk>[^/.]+)/get_b/$ [name='booksaction-get-b'] @action(methods=["get"],detail=True) def get_b(self,request,pk): book = self.get_queryset() ser = self.get_serializer(book,many=True) if int(pk) > 0: return Response({"code": 100, "msg": "success", "result": ser.data})
路由配置
router = routers.DefaultRouter() router.register('booksaction',ap01view.ActionModeViewSetDemo)
3、路由:
drf 框架中 提供了2种路由 DefaultRouter、SimpleRouter,区别就是DefaultRouter 会生成更多的路由,并且会生成根路由,SimpleRouter 只有 2种
注(生成的路由并不等于需要被调用的方法 get、post等)
SimpleRouter
DefaultRouter:
标签:GenericAPIView,get,detail,视图,集合,方法,路由,Drf 来源: https://www.cnblogs.com/yuan-x/p/16632763.html