1. 两个基本视图集
1.1 ViewSet
继承自APIView,作用也与APIView基本类似。在ViewSet中,没有提供任何动作action方法,需要我们自己实现action方法。
from rest_framework import mixinsfrom rest_framework.viewsets import GenericViewSetfrom rest_framework.decorators import actionclass BookInfoViewSet(ViewSet):# detail为False 表示不需要处理具体的BookInfo对象@action(methods=['get'], detail=False)def latest(self, request):"""返回最新的图书信息"""book = BookInfo.objects.latest('id')ser = BookSerialzier(book)return Response(ser.data)# detail为True,表示要处理具体与pk主键对应的BookInfo对象@action(methods=['put'], detail=True)def read(self, request, pk):"""修改图书的阅读量数据"""try:book = BookInfo.objects.get(id=pk)except:return JsonResponse({'error': '错误信息'}, status=400)book.bread = request.data.get('read')book.save()ser = BookSerialzier(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<pk>\d+)/$', views.BookInfoViewSet.as_view({'get': 'retrieve'})),url(r'^books/(?P<pk>\d+)/read/$', views.BookInfoViewSet.as_view({'put': 'read'})),]
1.2 GenericViewset
继承自GenericAPIView,作用也与GenericAPIVIew类似,提供了get_object、get_queryset等方法便于列表视图与详情信息视图的开发。
class Books(GenericViewSet):queryset = BookInfo.objects.all() # 指定当前类视图使用的查询集数据serializer_class = BookSerialzier # 指定当前类视图使用的序列化器def list(self, request):# 1、查询所有图书对象books =self.get_queryset()ser = self.get_serializer(books,many=True)return Response(ser.data)def create(self, request):# 1、获取前端数据# data = request.body.decode()# data_dict = json.loads(data)data = request.data# 2、验证数据ser = self.get_serializer(data=data)ser.is_valid() # 验证方法# 3、保存数据ser.save()# 4、返回结果return Response(ser.data)
1.3 两个拓展视图集
1.3.1 ModelViewSet
继承自GenericAPIVIew,同时还继承了5个拓展类:ListModelMixin、RetrieveModelMixin、CreateModelMixin、UpdateModelMixin、DestoryModelMixin。
1.3.2 ReadOnlyModelViewSet
继承自GenericAPIVIew,同时包括了ListModelMixin、RetrieveModelMixin。
2. 使用视图集类
- 导包:
**from rest_framework import viewsets**,viewsets是一个文件,里面含有以上介绍的视图集类。 - 类视图继承视图集ViewSet后,不再实现get(),post()等方法,而是实现以下五个动作:
- list() 提供一组数据
- retrieve() 提供单个数据
- create() 创建数据
- update() 保存数据
- destory() 删除数据
- 类视图虽然实现了以上5个动作,但是需要在路由匹配的时候告诉Django使用类视图中的那个方法来处理接收到的请求。 ```python from rest_framework.viewsets import ViewSet
class UserSet(ViewSet): def list(self, request): … def retrieve(self, request, pk=None): …
```pythonurlpatterns = [url(r'^books/$', BookInfoViewSet.as_view({'get':'list'}),url(r'^books/(?P<pk>\d+)/$', BookInfoViewSet.as_view({'get': 'retrieve'})]
- action属性:在视图集中,通过action对象属性来获取当前请求视图集时的action动作是哪个。
使用action装饰器自定义方法:
添加自定义动作需要使用rest_framework.decorators.action装饰器。
以action装饰器装饰的方法名会作为action动作名,与list、retrieve等同。
action装饰器可以接收两个参数:methods:该action支持的请求方式,列表传递
- detail:表示是action中要处理的是否是视图资源的对象(即是否通过url路径获取主键)
