一、概述

  • 特点:
    • 可以把多组相关的操作放在一个类中完成,如增删改查操作,而不必分为列表视图和详情视图
    • 不提供get、post方法,而是使用retrieve、create、list等方法代替
    • 可以将get、post、put、delete等标准的请求方式使用as_view()和mixins中的方法做关系映射
  • 常见的视图集:
    • ViewSet:继承自APIView,不提供任何的操作,但是可以使用权限和认证,可以进行请求方式关系映射
    • GenericViewSet:继承自GenericAPIView和ViewSetMixin,可以使用GenericAPIView的所有方法和属性,可以进行请求方式关系映射
    • ModelViewSet:继承自GenericAPIView和五个mixins类,提供list、retrieve、update、destroy和create方法,并且可以使用GenericAPIView的所有方法和属性
    • ReadOnlyViewSet:继承自GenericAPIView类和mixins中的RetrieveModelMixin和ListModelMixin类,该视图集是一个只读的视图集,只能使用retrieve和list方法,并且可以使用GenericAPIView的所有方法和属性

      二、VIewSet的使用

      get_object_or_404:如果可以获取对象则返回返回数据,如果获取不到则返回404

  1. from rest_framework.viewsets import ViewSet
  2. from django.shortcuts import get_object_or_404
  3. class UserViewSet(ViewSet):
  4. """ ViewSet视图集 """
  5. def list(self, request):
  6. queryset = UserProfile.objects.all()
  7. serializer = UserProfileSerializers(instance=queryset, many=True)
  8. return Response(serializer.data)
  9. def retrieve(self, request, id):
  10. queryset = UserProfile.objects.all()
  11. user = get_object_or_404(queryset, id=id)
  12. lookup_url_kwarg = 'id'
  13. serializer = UserProfileSerializers(instance=user)
  14. return Response(serializer.data)
  15. ########## urls.py
  16. from django.urls import path
  17. from . import views
  18. viewset = views.UserViewSet.as_view({
  19. 'get': 'list',
  20. 'get': 'retrieve',
  21. })
  22. urlpatterns = [
  23. path('viewset/<int:id>', viewset, name="viewset")
  24. ]

三、ReadOnlyViewSet的使用

ReadOnlyViewSet中url设置必须把带id和不带id的分开写,不能合并为一个,并且必须必须在as_view()中设置关系映射

  1. from rest_framework.viewsets import ReadOnlyModelViewSet
  2. class UserReadOnlyViewSet(ReadOnlyModelViewSet):
  3. """ ReadOnlyModelViewSet创建视图集 """
  4. queryset = UserProfile.objects.all()
  5. serializer_class = UserProfileSerializers
  6. lookup_url_kwarg = 'id'
  7. ########## urls.py
  8. from django.urls import path
  9. from . import views
  10. urlpatterns = [
  11. path('readonly',
  12. views.UserReadOnlyViewSet.as_view({'get': 'list'}), name="readonly"),
  13. path('readonly/<int:id>',
  14. views.UserReadOnlyViewSet.as_view({'get': 'retrieve'}), name="readonly")
  15. ]

四、ModelViewSet实现列表视图和详情视图

  • 在ModelViewSet中已经继承了所有的方法,所以不需要额外的操作,只需要设置queryset、serializer_class和lookup_field属性即可
  • 路由中带参数和不带参数的必须分开
  1. from rest_framework.viewsets import ModelViewSet
  2. class UserModelViewSet(ModelViewSet):
  3. """ ModelViewSet实现详情视图和列表视图 """
  4. queryset = UserProfile.objects.all()
  5. serializer_class = UserProfileSerializers
  6. # lookup_url_kwarg = 'id'
  7. lookup_field = 'id'
  8. ######## urls.py
  9. from django.urls import path
  10. from . import views
  11. urlpatterns = [
  12. path('model', views.UserModelViewSet.as_view({'get': 'list',
  13. 'post': 'create', }), name="model"),
  14. path('model/<int:id>', views.UserModelViewSet.as_view({'get': 'retrieve',
  15. 'put': 'update',
  16. 'delete': 'destroy'}), name="modeldetail")
  17. ]