1. 两个基本视图集

1.1 ViewSet

继承自APIView,作用也与APIView基本类似。在ViewSet中,没有提供任何动作action方法,需要我们自己实现action方法。

  1. from rest_framework import mixins
  2. from rest_framework.viewsets import GenericViewSet
  3. from rest_framework.decorators import action
  4. class BookInfoViewSet(ViewSet):
  5. # detail为False 表示不需要处理具体的BookInfo对象
  6. @action(methods=['get'], detail=False)
  7. def latest(self, request):
  8. """
  9. 返回最新的图书信息
  10. """
  11. book = BookInfo.objects.latest('id')
  12. ser = BookSerialzier(book)
  13. return Response(ser.data)
  14. # detail为True,表示要处理具体与pk主键对应的BookInfo对象
  15. @action(methods=['put'], detail=True)
  16. def read(self, request, pk):
  17. """
  18. 修改图书的阅读量数据
  19. """
  20. try:
  21. book = BookInfo.objects.get(id=pk)
  22. except:
  23. return JsonResponse({'error': '错误信息'}, status=400)
  24. book.bread = request.data.get('read')
  25. book.save()
  26. ser = BookSerialzier(book)
  27. return Response(serializer.data)

url的定义:

  1. urlpatterns = [
  2. url(r'^books/$', views.BookInfoViewSet.as_view({'get': 'list'})),
  3. url(r'^books/latest/$', views.BookInfoViewSet.as_view({'get': 'latest'})),
  4. url(r'^books/(?P<pk>\d+)/$', views.BookInfoViewSet.as_view({'get': 'retrieve'})),
  5. url(r'^books/(?P<pk>\d+)/read/$', views.BookInfoViewSet.as_view({'put': 'read'})),
  6. ]

1.2 GenericViewset

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

  1. class Books(GenericViewSet):
  2. queryset = BookInfo.objects.all() # 指定当前类视图使用的查询集数据
  3. serializer_class = BookSerialzier # 指定当前类视图使用的序列化器
  4. def list(self, request):
  5. # 1、查询所有图书对象
  6. books =self.get_queryset()
  7. ser = self.get_serializer(books,many=True)
  8. return Response(ser.data)
  9. def create(self, request):
  10. # 1、获取前端数据
  11. # data = request.body.decode()
  12. # data_dict = json.loads(data)
  13. data = request.data
  14. # 2、验证数据
  15. ser = self.get_serializer(data=data)
  16. ser.is_valid() # 验证方法
  17. # 3、保存数据
  18. ser.save()
  19. # 4、返回结果
  20. 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): …

  1. ```python
  2. urlpatterns = [
  3. url(r'^books/$', BookInfoViewSet.as_view({'get':'list'}),
  4. url(r'^books/(?P<pk>\d+)/$', BookInfoViewSet.as_view({'get': 'retrieve'})
  5. ]
  • action属性:在视图集中,通过action对象属性来获取当前请求视图集时的action动作是哪个。
  • 使用action装饰器自定义方法:

    添加自定义动作需要使用rest_framework.decorators.action装饰器。
    以action装饰器装饰的方法名会作为action动作名,与list、retrieve等同。
    action装饰器可以接收两个参数:

  • methods:该action支持的请求方式,列表传递

  • detail:表示是action中要处理的是否是视图资源的对象(即是否通过url路径获取主键)
    • True 表示使用通过URL获取的主键对应的数据对象
    • False 表示不使用URL获取主键

      3. Router类

      REST framework提供了两个router类:SimpleRouter类,DefaultRouter类