rest_framework-08-视图
请求方式:
视图
1.GenericAPIView # 视图
2.GenericViewSet # 视图 劣势:指向同一个视图,get无法区分是查询单个对象还是所有数据。
3.ModelViewSet # 视图 最强大:增、删、改、查、局部更新6个方法。
总结:
a. 增删改查 ModelViewSet 最强大:增、删、改、查、局部更新6个方法。
b. 增删 CreateModelMixin,DestroyModelMixin, GenericViewSet
c. 复杂逻辑 GenericViewSet 或 APIView
# =================================================================GenericAPIView # 视图
1.urls.py
2.视图
运行结果:
3.视图类
4.源码。继承了APIview
部分方法:
5.views.py
运行结果:
总结:
2. 视图 a. 过去 class Pager1View(View): pass b. 现在 class Pager1View(APIView): # View pass c. 无用 from rest_framework.generics import GenericAPIView # 视图 from api.utils.serializers.pager import PagerSerializers # 序列化 from rest_framework.response import Response # 渲染器 from rest_framework.pagination import PageNumberPagination # 分页 class View1View(GenericAPIView): queryset = models.Role.objects.all() # 所有数据集合 serializer_class = PagerSerializers # 序列化对象 pagination_class = PageNumberPagination # 分页对象 def get(self, request, *args, **kwargs): roles = self.get_queryset() # 拿到所有的数据集合 pager_roles = self.paginate_queryset(roles) # 进行分页 拿到某一部分数据 ser = self.get_serializer(instance=pager_roles,many=True) # 获取序列化的数据 return Response(ser.data) # 渲染器
#===================================================================GenericViewSet # 视图
d:GenericViewSet # 视图
1.源码:继承
2.views.py
运行报错:
少传了参数
3.urls.py 视图必须传参 views.View1View.as_view({'get': 'list'}))
说明ViewSetMixin类下重写了as_view方法
查看源码:
4.get请求执行list方法
运行结果:
5.还可以写其他请求。根据请求方式不同,执行对应的方法。
注意:urls.py路径上传了的方法,视图上必须写该的方法,否则会报错。
6.功能和c类GenericAPIView 视图类一样。给一下函数名即可。
运行结果:
小结:
d. GenericViewSet(ViewSetMixin, generics.GenericAPIView): 路由: url(r'^(?P<version>[v1|v2]+)/v1/$', views.View1View.as_view({'get': 'list'})), 视图: from api.utils.serializsers.pager import PagerSerialiser from rest_framework.viewsets import GenericViewSet class View1View(GenericViewSet): queryset = models.Role.objects.all() serializer_class = PagerSerialiser pagination_class = PageNumberPagination def list(self, request, *args, **kwargs): # 获取数据 roles = self.get_queryset() # models.Role.objects.all() # [1, 1000,] [1,10] pager_roles = self.paginate_queryset(roles) # 序列化 ser = self.get_serializer(instance=pager_roles, many=True) return Response(ser.data)
#===================================================================ModelViewSet # 视图
1.ModelViewSet 类 源码:
2.ListModelMixin源码:
3.
运行结果:
4.增加一个post请求
运行结果:
增加一条数据
增加一条数据后,返回的结果:
5.CreateModelMixin源码:
6.get请求查单条数据,需要传id.
RetrieveModelMixin类下的retrieve方法。
7.删除单条数据,都需要传id.
8.更新单条数据,都需要传id.
9.urls.py
10.views.py:写了4行代码就实现了所有功能。
11.运行结果:查
12.运行结果:删
返回值:
代码:ModelViewSet # 视图
e. 路由系统: url(r'^(?P<version>[v1|v2]+)/v1/$', views.View1View.as_view({'get': 'list','post':'create'})), url(r'^(?P<version>[v1|v2]+)/v1/(?P<pk>d+)/$', views.View1View.as_view({'get': 'retrieve','delete':'destroy','put':'update','patch':'partial_update'})), 视图: from api.utils.serializsers.pager import PagerSerialiser from rest_framework.viewsets import GenericViewSet,ModelViewSet from rest_framework.mixins import ListModelMixin,CreateModelMixin class View1View(ModelViewSet): queryset = models.Role.objects.all() serializer_class = PagerSerialiser pagination_class = PageNumberPagination