REST framework 视图类之视图集 viewsets

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

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值