rest_framework-08-视图

 

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

 

 



 

posted @ 2018-07-08 19:01  yimi+fly  阅读(128)  评论(0编辑  收藏  举报