rest framework ViewSet
ViewSets
路由选择确定要用于一个请求哪个控制器之后,控制器负责做出请求的感并产生相应的输出。
Django的REST框架允许你的逻辑一组在一个类中的相关意见,称为结合ViewSet
。在其他框架中,你还可以找到一个名为类似“资源”或“控制器”概念上类似的实现。
甲ViewSet
类只是一种类型的基于类的视图,即不提供任何方法的处理程序,例如.get()
或.post()
,而是提供操作,如.list()
和.create()
。
用于该方法的处理程序ViewSet
,在最终确定视图中,使用的点仅绑定到相应的动作.as_view()
方法。
通常情况下,而不是明确地注册在URL配置一个视图集的意见,你会注册一个路由器类的视图集,可以自动确定您URL配置。
例
让我们来定义一个简单的视图集,可用于列表或检索系统中的所有用户。
from django.contrib.auth.models import User
from django.shortcuts import get_object_or_404
from myapps.serializers import UserSerializer
from rest_framework import viewsets
from rest_framework.response import Response
class UserViewSet(viewsets.ViewSet):
"""
A simple ViewSet for listing or retrieving users.
"""
def list(self, request):
queryset = User.objects.all()
serializer = UserSerializer(queryset, many=True)
return Response(serializer.data)
def retrieve(self, request, pk=None):
queryset = User.objects.all()
user = get_object_or_404(queryset, pk=pk)
serializer = UserSerializer(user)
return Response(serializer.data)
如果我们需要,我们可以在此视图集中装订成两个独立的观点,就像这样:
user_list = UserViewSet.as_view({'get': 'list'})
user_detail = UserViewSet.as_view({'get': 'retrieve'})
通常,我们不会这么做,而是会注册一个路由器的视图集,并允许自动生成的URL配置。
from myapp.views import UserViewSet
from rest_framework.routers import DefaultRouter
router = DefaultRouter()
router.register(r'users', UserViewSet, basename='user')
urlpatterns = router.urls
而不是写你自己的viewsets,你会经常要使用现有的基础类,它们提供行为的默认设置。例如:
class UserViewSet(viewsets.ModelViewSet):
"""
A viewset for viewing and editing user instances.
"""
serializer_class = UserSerializer
queryset = User.objects.all()
有使用的两个主要优点ViewSet
类使用上一个View
类。
- 重复逻辑可以组合成一个单一的类。在上面的例子中,我们只需要指定
queryset
一次,它会在多个视图中使用。 - 通过使用路由器,我们不再需要处理类设置URL的conf自己。
这两个配备了权衡。使用常规视图和URL confs是更加明确,为您提供更多的控制。ViewSets是有益的,如果你想获得迅速启动和运行,或当你有一个大的API,并要强制贯穿一致的URL配置。
视图集中行动
包含REST框架默认的路由器将提供一组标准的创建/检索/更新/销毁风格的动作,途径如下图所示:
class UserViewSet(viewsets.ViewSet):
"""
Example empty viewset demonstrating the standard
actions that will be handled by a router class.
If you're using format suffixes, make sure to also include
the `format=None` keyword argument for each action.
"""
def list(self, request):
pass
def create(self, request):
pass
def retrieve(self, request, pk=None):
pass
def update(self, request, pk=None):
pass
def partial_update(self, request, pk=None):
pass
def destroy(self, request, pk=None):
pass
内省视图集中行动
在放行时,下列属性可用的ViewSet
。
basename
- 基本用于所创建的URL名称。action
-当前操作的名称(例如list
,create
)。detail
- 布尔值,指示如果当前的动作被配置为列表或详细视图。suffix
-反射镜的-为对视图集型的显示后缀detail
属性。name
-为视图集的显示名称。这种说法是互斥的suffix
。description
- 用于视图集的各个视图中的显示的说明。
您可以检查这些属性根据当前的动作来调整行为。例如,你可以限制权限,除了一切list
与此类似的行动:
def get_permissions(self):
"""
Instantiates and returns the list of permissions that this view requires.
"""
if self.action == 'list':
permission_classes = [IsAuthenticated]
else:
permission_classes = [IsAdmin]
return [permission() for permission in permission_classes]
标记路由额外行动
如果你有特别的方法应该是可路由的,你可以将它们标记为这样的与@action
装饰。像普通的行动,额外的操作会被用于任何单个对象或整个集合。为了说明这一点,设置detail
参数True
或False
。路由器将相应地配置其URL模式。例如,DefaultRouter
将配置详细的行动包含pk
在他们的URL模式。
额外行动的更完整的例子:
from django.contrib.auth.models import User
from rest_framework import status, viewsets
from rest_framework.decorators import action
from rest_framework.response import Response
from myapp.serializers import UserSerializer, PasswordSerializer
class UserViewSet(viewsets.ModelViewSet):
"""
A viewset that provides the standard actions
"""
queryset = User.objects.all()
serializer_class = UserSerializer
@action(detail=True, methods=['post'])
def set_password(self, request, pk=None):
user = self.get_object()
serializer = PasswordSerializer(data=request.data)
if serializer.is_valid():
user.set_password(serializer.data['password'])
user.save()
return Response({'status': 'password set'})
else:
return Response(serializer.errors,
status=status.HTTP_400_BAD_REQUEST)
@action(detail=False)
def recent_users(self, request):
recent_users = User.objects.all().order_by('-last_login')
page = self.paginate_queryset(recent_users)
if page is not None:
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = self.get_serializer(recent_users, many=True)
return Response(serializer.data)
该装饰还可以采取将只对路由的视图设置额外的参数。例如:
@action(detail=True, methods=['post'], permission_classes=[IsAdminOrIsSelf])
def set_password(self, request, pk=None):
...
在action
装饰后,系统会GET
默认请求,也可以接受设定其他HTTP方法methods
的参数。例如:
@action(detail=True, methods=['post', 'delete'])
def unset_password(self, request, pk=None):
...
然后这两个新的行动将可在网址^users/{pk}/set_password/$
和^users/{pk}/unset_password/$
要查看所有多余的动作,调用.get_extra_actions()
方法。
路由额外行动额外的HTTP方法
额外的动作可以映射其他HTTP方法分离ViewSet
的方法。例如,上述的密码设置/取消方法可以合并成一个单一的路由。需要注意的是附加映射不接受参数。
@action(detail=True, methods=['put'], name='Change Password')
def password(self, request, pk=None):
"""Update the user's password."""
...
@password.mapping.delete
def delete_password(self, request, pk=None):
"""Delete the user's password."""
...
扭转操作URL
如果你需要得到一个动作的URL,使用.reverse_action()
方法。这是一个方便的包装reverse()
,自动传递视图的request
对象和前面加上url_name
与.basename
属性。
请注意,basename
是由路由器期间提供ViewSet
登记。如果您没有使用路由器,则必须提供basename
参数的.as_view()
方法。
使用前面部分的示例:
>>> view.reverse_action('set-password', args=['1'])
'http://localhost:8000/api/users/1/set_password'
另外,您也可以使用url_name
由设置属性@action
装饰。
>>> view.reverse_action(view.set_password.url_name, args=['1'])
'http://localhost:8000/api/users/1/set_password'
该url_name
论据.reverse_action()
应该与相同参数的@action
装饰。此外,该方法可用于扭转默认动作,如list
和create
。
API参考
视图集
将ViewSet
类从继承APIView
。您可以使用任何标准的属性,如permission_classes
,authentication_classes
以控制在视图集的API政策。
本ViewSet
类不提供任何操作实现。为了使用一个ViewSet
类,你会覆盖类,并明确定义的操作实现。
GenericViewSet
在GenericViewSet
从类继承GenericAPIView
,并提供了默认设置get_object
,get_queryset
方法及其他通用视图基地的行为,但不包括默认情况下,任何动作。
为了使用一个GenericViewSet
类,你会覆盖类,要么混入所需的混入类,或者明确定义的操作实现。
ModelViewSet
在ModelViewSet
从类继承GenericAPIView
,并包括用于各种动作实现方式中,通过在各种混入类的行为混合。
由提供的动作ModelViewSet
类是.list()
,.retrieve()
, .create()
,.update()
,.partial_update()
,和.destroy()
。
例
因为ModelViewSet
延伸GenericAPIView
,你通常需要提供至少queryset
和serializer_class
属性。例如:
class AccountViewSet(viewsets.ModelViewSet):
"""
A simple ViewSet for viewing and editing accounts.
"""
queryset = Account.objects.all()
serializer_class = AccountSerializer
permission_classes = [IsAccountAdminOrReadOnly]
注意,你可以使用任何提供的标准属性或方法重写的GenericAPIView
。例如,使用ViewSet
的是动态确定它应该在操作查询集,你可能会做这样的事情:
class AccountViewSet(viewsets.ModelViewSet):
"""
A simple ViewSet for viewing and editing the accounts
associated with the user.
"""
serializer_class = AccountSerializer
permission_classes = [IsAccountAdminOrReadOnly]
def get_queryset(self):
return self.request.user.accounts.all()
然而要注意在移除的queryset
从你的财产ViewSet
,任何相关的路由器将无法自动推导模型的基本名称,所以你必须指定basename
kwarg作为您的一部分路由器注册。
还要注意的是,虽然这个类提供了一套完整的创建/列表/检索/更新/销毁默认操作,您可以使用标准的权限类限制可用的操作。
ReadOnlyModelViewSet
该ReadOnlyModelViewSet
班也继承GenericAPIView
。正如ModelViewSet
它也包括了各种动作的实现,但不像ModelViewSet
只提供“只读”的行动,.list()
和.retrieve()
。
例
正如ModelViewSet
,你通常需要提供至少queryset
和serializer_class
属性。例如:
class AccountViewSet(viewsets.ReadOnlyModelViewSet):
"""
A simple ViewSet for viewing accounts.
"""
queryset = Account.objects.all()
serializer_class = AccountSerializer
同样,与ModelViewSet
,你可以使用任何标准的属性和可用的方法重写的GenericAPIView
。
自定义视图集中的基类
您可能需要提供自定义ViewSet
不具有完整的一组类ModelViewSet
的行动,或者定制一些其他方式的行为。
例
要创建基础视图集类,提供create
,list
和retrieve
操作,继承GenericViewSet
和混入所需的操作:
from rest_framework import mixins
class CreateListRetrieveViewSet(mixins.CreateModelMixin,
mixins.ListModelMixin,
mixins.RetrieveModelMixin,
viewsets.GenericViewSet):
"""
A viewset that provides `retrieve`, `create`, and `list` actions.
To use it, override the class and set the `.queryset` and
`.serializer_class` attributes.
"""
pass
通过创建自己的基ViewSet
类,可以提供可在您的API多个viewsets重复使用共同的行为。
rest framework ViewSet的更多相关文章
- windows类书的学习心得
原文网址:http://www.blogjava.net/sound/archive/2008/08/21/40499.html 现在的计算机图书发展的可真快,很久没去书店,昨日去了一下,真是感叹万千 ...
- RESTful源码笔记之RESTful Framework的APIview, Viewset总结分析
0x00 引言 官方文档:http://www.django-rest-framework.org/drf为我们提供强大的通用view的功能,本博客对这些view进行简要的总结分析.首先,我们看一下 ...
- django rest framework的viewset中关于ModelViewset的定义
---恢复内容开始--- viewset的关于ModelViewSet的定义是: class ModelViewSet(mixins.CreateModelMixin, mixins.Retrieve ...
- 利用 Django REST framework 编写 RESTful API
利用 Django REST framework 编写 RESTful API Updateat 2015/12/3: 增加 filter 最近在玩 Django,不得不说 rest_framewor ...
- django rest framework 的url标签的问题
如何在模板中引用一个在rest framework中的url? urls.py from django.conf.urls import patterns, url from .views impor ...
- Django REST framework使用ViewSets的自定义路由实现过程
在Django中使用基于类的视图(ClassView),类中所定义的方法名称与Http的请求方法相对应,才能基于路由将请求分发(dispatch)到ClassView中的方法进行处理,而Django ...
- Django REST framework+Vue 打造生鲜超市(一)
一.项目介绍 1.1.掌握的技术 Vue + Django Rest Framework 前后端分离技术 彻底玩转restful api 开发流程 Django Rest Framework 的功能实 ...
- Django REST framework+Vue 打造生鲜超市(四)
五.商品列表页 5.1.django的view实现商品列表页 (1)goods/view_base.py 在goods文件夹下面新建view_base.py,为了区分django和django res ...
- django rest framework serializers
django rest framework serializers序列化 serializers是将复杂的数据结构变成json或者xml这个格式的 serializers有以下几个作用:- 将qu ...
随机推荐
- solidity的函数修改器(modifier)
内容:modifier的定义.modifier对函数参数的操作.modifier执行的顺序 modifier的定义 官方文档:modifier可以改变函数的行为.可以被继承和重写. 其实modifie ...
- KVM Pass-through 上部署 MiniSMB HurricaneII
KVM Pass-through 上部署 MiniSMB HurricaneII 免费网络测试,是一款专门用于测试无线控制器, 智能路由器,网络交换机的性能和稳定性的软硬件相结合的工具.可以通过此工具 ...
- 卸载vue2.9.6版本,安装新版本
1.检查vue安装目录(cmd中输入) where vue 2.删除目录中的关于vue的文件(可以将文件按时间排序,找到vue相关的文件删除) 3.检查vue是否还能找到 4.安装新版本的vue np ...
- Leetcode(15)-三数之和
给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组. 注意:答案中不可以包含重复的三元组. ...
- CSS 滚动条宽度 All In One
CSS 滚动条宽度 All In One 滚动条宽度 IE 16px Chrome 12px scrollbar width bug 改变设计稿的宽度,没考虑到 scrollbar width sol ...
- free online linux terminal & github cli online
free online linux terminal & github cli online gitpod https://www.gitpod.io/features/ https://bc ...
- IM & RTC
IM & RTC 即时通信(IM) & 实时通信(RTC) 场景 即时通信(可靠性高,延时高) 场景包括文字聊天.语音消息发送.文件传输.音视频播放等; 发短信 实时通信(可靠性低,延 ...
- javascript & global event & custom event
javascript & global event & custom event new CustomEvent object let event = new CustomEvent( ...
- 科普NGK公链生态板块旗下的BGV、SPC、NGK、USDN四大币种
众所周知,NGK公链所有数据上链.公开透明,NGK公链生态板块目前主要分为四个板块---BGV.SPC.NGK.USDN四大币种,笔者以时间上倒叙手法来一一科普. 首先,是2021新年刚推出的SPC侧 ...
- 以NGK 呼叫河马为例分析智能合约漏洞在哪?
合约交易是指买方和卖方根据约定,在未来某一时刻,以指定价格接受某一资产的协议. 合约是买卖双方之间权利义务的表现形式.合约交易是一种金融衍生工具,与现货市场相比,用户通过判断期货合约交易的涨跌,选择买 ...