视图集ViewSet
使用视图集ViewSet,能够将一系列逻辑相关的动做放到一个类中:post
list() 提供一组数据
retrieve() 提供单个数据
create() 建立数据
update() 保存数据
destory() 删除数据
ViewSet视图集类再也不实现get()、post()等方法,而是实现动做 action 如 list() 、create() 等。url
视图集只在使用as_view()方法的时候,才会将action动做与具体请求方式对应上。如:rest
class BookInfoViewSet(viewsets.ViewSet):code
def list(self, request): ... def retrieve(self, request, pk=None): ...
在设置路由时,咱们能够以下操做对象
urlpatterns = [
url(r'^books/$', BookInfoViewSet.as_view({'get':'list'}),
url(r'^books/(?P
]
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等方法便于列表视图与详情信息视图的开发。get
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 mixins
from rest_framework.viewsets import GenericViewSet
from rest_framework.decorators import action
class 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
url(r'^books/(?P