博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
视图集ViewSet
阅读量:6613 次
发布时间:2019-06-24

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

hot3.png

使用视图集ViewSet,可以将一系列逻辑相关的动作放到一个类中:

  • list() 提供一组数据
  • retrieve() 提供单个数据
  • create() 创建数据
  • update() 保存数据
  • destory() 删除数据

ViewSet视图集类不再实现get()、post()等方法,而是实现动作 action 如 list() 、create() 等。

视图集只在使用as_view()方法的时候,才会将action动作与具体请求方式对应上。如:

class BookInfoViewSet(viewsets.ViewSet):    def list(self, request):        ...    def retrieve(self, request, pk=None):        ...

在设置路由时,我们可以如下操作

urlpatterns = [    url(r'^books/$', BookInfoViewSet.as_view({'get':'list'}),    url(r'^books/(?P
\d+)/$', BookInfoViewSet.as_view({'get': 'retrieve'})]

action属性

在视图集中,我们可以通过action对象属性来获取当前请求视图集时的action动作是哪个。

例如:

def get_serializer_class(self):    if self.action == 'create':        return OrderCommitSerializer    else:        return OrderDataSerializer

常用视图集父类

1) ViewSet

继承自APIView,作用也与APIView基本类似,提供了身份认证、权限校验、流量管理等。

在ViewSet中,没有提供任何动作action方法,需要我们自己实现action方法。

2)GenericViewSet

继承自GenericAPIView,作用也与GenericAPIVIew类似,提供了get_object、get_queryset等方法便于列表视图与详情信息视图的开发。

3)ModelViewSet

继承自GenericAPIVIew,同时包括了ListModelMixin、RetrieveModelMixin、CreateModelMixin、UpdateModelMixin、DestoryModelMixin。

4)ReadOnlyModelViewSet

继承自GenericAPIVIew,同时包括了ListModelMixin、RetrieveModelMixin。

视图集中定义附加action动作

在视图集中,除了上述默认的方法动作外,还可以添加自定义动作。

添加自定义动作需要使用rest_framework.decorators.action装饰器。

以action装饰器装饰的方法名会作为action动作名,与list、retrieve等同。

action装饰器可以接收两个参数:

  • methods: 该action支持的请求方式,列表传递
  • detail: 表示是action中要处理的是否是视图资源的对象(即是否通过url路径获取主键)
    • True 表示使用通过URL获取的主键对应的数据对象
    • False 表示不使用URL获取主键

举例:

from rest_framework import mixinsfrom rest_framework.viewsets import GenericViewSetfrom rest_framework.decorators import actionclass BookInfoViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, GenericViewSet):    queryset = BookInfo.objects.all()    serializer_class = BookInfoSerializer    # detail为False 表示不需要处理具体的BookInfo对象    @action(methods=['get'], detail=False)    def latest(self, request):        """        返回最新的图书信息        """        book = BookInfo.objects.latest('id')        serializer = self.get_serializer(book)        return Response(serializer.data)    # detail为True,表示要处理具体与pk主键对应的BookInfo对象    @action(methods=['put'], detail=True)    def read(self, request, pk):        """        修改图书的阅读量数据        """        book = self.get_object()        book.bread = request.data.get('read')        book.save()        serializer = self.get_serializer(book)        return Response(serializer.data)

url的定义

urlpatterns = [    url(r'^books/$', views.BookInfoViewSet.as_view({'get': 'list'})),    url(r'^books/latest/$', views.BookInfoViewSet.as_view({'get': 'latest'})),    url(r'^books/(?P
\d+)/$', views.BookInfoViewSet.as_view({'get': 'retrieve'})), url(r'^books/(?P
\d+)/read/$', views.BookInfoViewSet.as_view({'put': 'read'})),]

视图集的继承关系

转载于:https://my.oschina.net/u/4142063/blog/3056577

你可能感兴趣的文章
new static 跟 new self 区别
查看>>
数据库连接池
查看>>
戴文的Linux内核专题:02源代码
查看>>
ie8下的透明 问题
查看>>
Xcode6无法定位解决方案CLLocationManager定位权限
查看>>
如何删除在Excel中存在的无效的链接呢
查看>>
C#防止在画面上闪烁的Button
查看>>
(十)2005年我的第一次软件行业创业,烧掉30万、2年时间打水漂的惨痛教训总结篇...
查看>>
走火入魔.NET从C/S单点登录到B/S系统的例子,SUID(System Unique Identification)
查看>>
答客户疑问 ASP.NET C#.NET 通用权限管理系统组件源码的 B/S C/S 这里有什么区别?...
查看>>
lol win8
查看>>
使用命令安装Google
查看>>
IOS 字符串的Format可以对数值四舍五入
查看>>
jQuery简单手风琴效果(Accordion)学习总结
查看>>
PHP AES256加密算法
查看>>
thinkphp-条件判断-if标签2
查看>>
SQL-23 对所有员工的当前(to_date='9999-01-01')薪水按照salary进行按照1-N的排名,相同salary并列且按照emp_no升序排列...
查看>>
VMware ESX虚拟机中提示IP地址已经分配给其他网卡
查看>>
负载均衡集群LVS实战篇
查看>>
老吴聊IT申请入驻搜狐公众平台,特此声明
查看>>