一、概述
- 特点:
- 可以把多组相关的操作放在一个类中完成,如增删改查操作,而不必分为列表视图和详情视图
- 不提供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
from rest_framework.viewsets import ViewSetfrom django.shortcuts import get_object_or_404class UserViewSet(ViewSet):""" ViewSet视图集 """def list(self, request):queryset = UserProfile.objects.all()serializer = UserProfileSerializers(instance=queryset, many=True)return Response(serializer.data)def retrieve(self, request, id):queryset = UserProfile.objects.all()user = get_object_or_404(queryset, id=id)lookup_url_kwarg = 'id'serializer = UserProfileSerializers(instance=user)return Response(serializer.data)########## urls.pyfrom django.urls import pathfrom . import viewsviewset = views.UserViewSet.as_view({'get': 'list','get': 'retrieve',})urlpatterns = [path('viewset/<int:id>', viewset, name="viewset")]
三、ReadOnlyViewSet的使用
ReadOnlyViewSet中url设置必须把带id和不带id的分开写,不能合并为一个,并且必须必须在as_view()中设置关系映射
from rest_framework.viewsets import ReadOnlyModelViewSetclass UserReadOnlyViewSet(ReadOnlyModelViewSet):""" ReadOnlyModelViewSet创建视图集 """queryset = UserProfile.objects.all()serializer_class = UserProfileSerializerslookup_url_kwarg = 'id'########## urls.pyfrom django.urls import pathfrom . import viewsurlpatterns = [path('readonly',views.UserReadOnlyViewSet.as_view({'get': 'list'}), name="readonly"),path('readonly/<int:id>',views.UserReadOnlyViewSet.as_view({'get': 'retrieve'}), name="readonly")]
四、ModelViewSet实现列表视图和详情视图
- 在ModelViewSet中已经继承了所有的方法,所以不需要额外的操作,只需要设置queryset、serializer_class和lookup_field属性即可
- 路由中带参数和不带参数的必须分开
from rest_framework.viewsets import ModelViewSetclass UserModelViewSet(ModelViewSet):""" ModelViewSet实现详情视图和列表视图 """queryset = UserProfile.objects.all()serializer_class = UserProfileSerializers# lookup_url_kwarg = 'id'lookup_field = 'id'######## urls.pyfrom django.urls import pathfrom . import viewsurlpatterns = [path('model', views.UserModelViewSet.as_view({'get': 'list','post': 'create', }), name="model"),path('model/<int:id>', views.UserModelViewSet.as_view({'get': 'retrieve','put': 'update','delete': 'destroy'}), name="modeldetail")]
