博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
3月8日学习内容整理:restframework的视图组件
阅读量:6875 次
发布时间:2019-06-26

本文共 3417 字,大约阅读时间需要 11 分钟。

这几天我们自定义的视图类都是继承的APIView,那么其实restframework为我们提供了几个视图类,各自有着不同的功能,我们可以选择继承其中的几个类来帮我们做事从而减少自己写的代码,这里就说一下restframework中视图类的继承关系

1、第一个类GenericAPIView

这个类就继承了APIView,但这个类其实没什么用,并没有帮我们做更多的事

from rest_framework.generics import GenericAPIViewclass PagerSerialiser(serializers.ModelSerializer):    class Meta:        model = models.Role        fields = "__all__"class View1View(GenericAPIView):  # APIView    queryset = models.Role.objects.all()    # 指定序列化类    serializer_class = PagerSerialiser    # 指定分页类,这里用的是第一种情况的分页    pagination_class = PageNumberPagination    def get(self, request, *args, **kwargs):        # 获取数据,这里就会用到上面定义的queryset,根据这个参数获取数据        roles = self.get_queryset()  # models.Role.objects.all()        # 获取分页后的数据        pager_roles = self.paginate_queryset(roles)        # 序列化        ser = self.get_serializer(instance=pager_roles, many=True)        return Response(ser.data)

 

2、第二个类GenericViewSet

这个类继承了两个类,左继承ViewSetMixin,右继承generics.GenericAPIView

这里继承的ViewSetMixin就会重写as_view方法,不会再去APIView中找了,会改变不同请求method对应的方法名

# URL中:重写as_view方法,{'get': 'list'}这个参数就代表着GET请求对应的get方法改为list# 所以我们在自定义view中针对GET请求的处理就要写list函数了url(r'^(?P
[v1|v2]+)/v1/$', views.View1View.as_view({
'get': 'list'})),from rest_framework.viewsets import GenericViewSetclass PagerSerialiser(serializers.ModelSerializer): class Meta: model = models.Role fields = "__all__"class View1View(GenericViewSet): queryset = models.Role.objects.all() # 指定序列化类和分页类 serializer_class = PagerSerialiser pagination_class = PageNumberPagination def list(self, request, *args, **kwargs): # 获取数据,还是要用到上面的queryset属性 roles = self.get_queryset() # models.Role.objects.all() # 获取分页的结果 pager_roles = self.paginate_queryset(roles) # 序列化 ser = self.get_serializer(instance=pager_roles, many=True) return Response(ser.data)

 

3、第三个类ModelViewSet

继承了六个类:

mixins.CreateModelMixin,   为我们提供了添加对象的方法

mixins.RetrieveModelMixin,   为我们提供了显示多个对象的方法,但是没有分页

mixins.UpdateModelMixin,    为我们提供修改数据的方法

mixins.DestroyModelMixin, 为我们提供删除数据的方法

mixins.ListModelMixin,     为我们提供显示多个对象的方法,并且包含分页

GenericViewSet  就是上面说到的第二个类

 

 

from rest_framework.viewsets import GenericViewSet, ModelViewSetfrom rest_framework.mixins import ListModelMixin, CreateModelMixin# 这个类因为继承了GenericViewSet所以as_view方法会重写# URL中:url(r'^(?P
[v1|v2]+)/v1/$', views.View1View.as_view({
'get': 'list','post':'create'})),url(r'^(?P
[v1|v2]+)/v1/(?P
\d+)/$', views.View1View.as_view({ 'get': 'retrieve', 'delete':'destroy', 'put':'update', 'patch':'partial_update'})),class PagerSerialiser(serializers.ModelSerializer): class Meta: model = models.Role fields = "__all__"class View1View(ModelViewSet): queryset = models.Role.objects.all() serializer_class = PagerSerialiser pagination_class = PageNumberPagination def list(self, request, *args, **kwargs): # 获取数据,还是要用到上面的queryset属性 roles = self.get_queryset() # models.Role.objects.all() # 获取分页的结果 pager_roles = self.paginate_queryset(roles) # 序列化 ser = self.get_serializer(instance=pager_roles, many=True) return Response(ser.data)

 

4、不同逻辑

a. 增删改查 ModelViewSet

b. 增删 CreateModelMixin,DestroyModelMixin GenericViewSet
c. 复杂逻辑 GenericViewSet 或 APIView

 

 

5、总结restframework中视图类的继承关系

 

 

转载于:https://www.cnblogs.com/wanghl1011/articles/8529071.html

你可能感兴趣的文章
artTemplate 学习网址和书籍
查看>>
C++对象内存分配
查看>>
Cong!
查看>>
PHP语言拓展json模块
查看>>
spring 配置文件applicationContext.xml命名空间及标签解析
查看>>
我的友情链接
查看>>
回到顶部代码(兼容IE6)
查看>>
web.xml文件的作用
查看>>
iOS开发篇——OC延展类目协议介绍
查看>>
期盼已久,不负所望!XenServer 6.5版本正式发布
查看>>
全方位解读云计算
查看>>
出来了,下雪了
查看>>
我的友情链接
查看>>
AFN网络图片获取
查看>>
Springboot官方构建下的mvnw.cmd的作用
查看>>
http://jquerymobile.com/ 手机特效制作
查看>>
我的友情链接
查看>>
我的友情链接
查看>>
Oracle EBS R12查看用户密码
查看>>
爬虫书籍
查看>>