viewsets
viewsets内拥有5个功能类
ViewSetMixin
作为viewsets内其他4个功能类的基本功能类(其他类直接或间接的继承了它)
功能: 重写as_view(),可以将请求方法与视图类中的自定义函数名完成映射
如: as_view({'get': 'list', 'post': 'my_post'})
ViewSet
继承: ViewSetMixin, views.APIView
作用也与APIView基本类似,提供了身份认证、权限校验、流量管理等。
ViewSet主要通过继承ViewSetMixin来实现在调用as_view()时传入字典(如{'get':'list'})的映射处理工作。
list、retrieve、create、update、destory等方法都需要自己编写
案例:
- views.py
class BookInfoViewSet(viewsets.ViewSet):
def list(self, request):
books = BookInfo.objects.all()
serializer = BookInfoSerializer(books, many=True)
return Response(serializer.data)
def retrieve(self, request, pk=None):
try:
books = BookInfo.objects.get(id=pk)
except BookInfo.DoesNotExist:
return Response(status=status.HTTP_404_NOT_FOUND)
serializer = BookInfoSerializer(books)
return Response(serializer.data)
- urls.py
urlpatterns = [
url(r'^books/$', BookInfoViewSet.as_view({'get':'list'}),
url(r'^books/(?P<pk>\d+)/$', BookInfoViewSet.as_view({'get': 'retrieve'})
]
GenericViewSet
继承: ViewSetMixin, generics.GenericAPIView
实现了调用as_view()时传入字典(如{'get':'list'}
)的映射处理工作的同时,还提供了GenericAPIView
提供的基础方法,可以直接搭配Mixin扩展类使用。
案例:
- views.py
from rest_framework.viewsets import GenericViewSet
from rest_framework import mixins
class BookGenericViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, GenericViewSet):
queryset = models.Book.objects.filter(is_delete=False)
serializer_class = serializers.BookModelSerializer
# 群查
def my_get_list(self, request, *args, **kwargs):
return self.list(request, *args, **kwargs)
# 单查
def my_get_obj(self, request, *args, **kwargs):
return self.retrieve(request, *args, **kwargs)
- urls.py
# View的as_view():将get请求映射到视图类的get方法
# ViewSet的as_view({'get': 'my_get_list'}):将get请求映射到视图类的my_get_list方法
url(r'^v5/books/$', views.BookGenericViewSet.as_view({'get': 'my_get_list'})),
url(r'^v5/books/(?P<pk>.*)/$', views.BookGenericViewSet.as_view({'get': 'my_get_obj'})),
ModelViewSet
继承: mixins.CreateModelMixin,mixins.RetrieveModelMixin,mixins.UpdateModelMixin,mixins.DestroyModelMixin,mixins.ListModelMixin,GenericViewSet
拥有六大接口:单查、群查、单增、单删、单整体改、单局部改
案例:
- views.py
# 注:一般肯定会重写destroy
from rest_framework.viewsets import ModelViewSet
class BookModelViewSet(ModelViewSet):
queryset = models.Book.objects.filter(is_delete=False)
serializer_class = serializers.BookModelSerializer
# 单删 改字段
def destroy(self, request, *args, **kwargs):
instance = self.get_object() # 拿到具体的model类
if not instance:
return APIResponse(1, '删除失败')
# 改字段
instance.is_delete = True
instance.save()
return APIResponse(0, '删除成功')
- urls.py
url(r'^v6/books/$', views.BookModelViewSet.as_view({'get': 'list', 'post': 'create'})),
url(r'^v6/books/(?P<pk>.*)/$', views.BookModelViewSet.as_view({'get': 'retrieve', 'put': 'update', 'patch': 'partial_update', 'delete': 'destroy'})),
ReadOnlyModelViewSet
继承: mixins.RetrieveModelMixin,mixins.ListModelMixin, GenericViewSet