上一章节我们讲了serializers层的各种写法,本章介绍view层的写法

一、使用APIView的写法见上一章节

二、使用mixinsgenerics书写视图层

  • 1、serializers保持用GoodsSerializersModel
  • 2、书写视图层

    from rest_framework import status, mixins, generics
    class GoodsListViewModelTwo(mixins.ListModelMixin, generics.GenericAPIView):
        """
        queryset就是这样写的
        serializer_class就是这样写的
        """
        queryset = Goods.objects.all()[:10]
        serializer_class = GoodsSerializersModel
        def get(self, request, *args, **kwargs):
            return self.list(request, *args, **kwargs)
  • 3、url配置保持不变

三、使用ListAPIView来写

  • 1、serializers保持用GoodsSerializersModel
  • 2、书写视图层

    class GoodsListViewModelTwo(generics.ListAPIView):
        queryset = Goods.objects.all()[:10]
        serializer_class = GoodsSerializersModel
  • 3、url配置保持不变

四、分页的配置

  • 1、在setting.py中配置一页显示多少条数据(别的都保持不变)

    
    # 配置分页显示
    
    REST_FRAMEWORK = {
        'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination',
        'PAGE_SIZE': 10
    }

五、使用viewsets

  • 1、视图层的书写

    from rest_framework import status, mixins, generics, viewsets
    class GoodListViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):
        queryset = Goods.objects.all()
        serializer_class = GoodsSerializersModel
  • 2、url.py的配置

    goods_list = GoodListViewSet.as_view({
        'get': 'list',
        # 'post': 'create'
    })
    urlpatterns = [
        url(r'^goods3/$', goods_list),
    ]

六、viewsetsrouter结合使用

  • 1、视图不变
  • 2、配置url变化

    from rest_framework.routers import DefaultRouter
    router = DefaultRouter()
    
    # 注册一个url地址
    
    router.register(r'goods3', GoodListViewSet)
    urlpatterns = [
        url(r'^', include(router.urls)),
        url(r'^xadmin/', xadmin.site.urls),
        url(r'^api-auth/', include('rest_framework.urls')),
        url(r'docs/', include_docs_urls(title='接口测试学习'))
    ]

七、上面分页是在settings.py文件中配置的,是会影响整个项目全部的视图,如果仅仅是在一个视图中使用分页可以考虑在视图中自己定义

  • 1、注释配置文件中的分页
  • 2、在视图中写一个类用于分页配置

    from rest_framework.pagination import PageNumberPagination
    class UserPagination(PageNumberPagination):
        """
        自己定义一个用户分页的类
        """
        page_size = 5  # 每页显示多少条数
        page_size_query_param = 'page_size'
        page_query_param = "page"
        max_page_size = 100
    
    
    class UserViewSet(viewsets.ModelViewSet):
        """
        关于用户的
        """
        queryset = UserModel.objects.all()
        serializer_class = UserSerializer
        # 使用分页
        pagination_class = UserPagination

八、关于使用viewsets.ModelViewSet的操作

  • 1、查看源码这个类继承了的类

    class ModelViewSet(mixins.CreateModelMixin,
                       mixins.RetrieveModelMixin,
                       mixins.UpdateModelMixin,
                       mixins.DestroyModelMixin,
                       mixins.ListModelMixin,
                       GenericViewSet):
        """
        A viewset that provides default `create()`, `retrieve()`, `update()`,
        `partial_update()`, `destroy()` and `list()` actions.
        """
        pass
  • 2、使用后我们视图中直接使用就可以(默认是支持get和post)

    class BlogViewSet(viewsets.ModelViewSet):
        """
        关于博客的
        """
        queryset = Blog.objects.all()
        serializer_class = BlogSerialzer
  • 3、如果需要修改或者删除数据可以重写

    class BookViewSet(viewsets.ModelViewSet):
        queryset = Book.objects.all()
        serializer_class = BookSerializer
    
        # 查询全部数据
        def get(self, request, *args, **kwargs):
            return self.list(request, args, kwargs)
    
        # 新增数据
        def post(self, request, *args, **kwargs):
            return self.create(request, *args, **kwargs)
    
        # 修改数据
        def patch(self, request, *args, **kwargs):
            return self.update(request, *args, **kwargs)
    
        # 删除数据
        def delete(self, request, *args, **kwargs):
            return self.destroy(request, *args, **kwargs)
  • 3、如果仅仅是需要get功能可以继承

    class BookViewSet(mixins.ListModelMixin, viewsets.GenericViewSe):
        pass

九、关于个人总结

  • 1、第八点中我们在views.py中使用了viewsets.ModelViewSet,虽然简单好用,但是在开发中往往会有壁垒,比如我仅仅是要get请求…
  • 2、个人建议使用mixins.CreateModelMixin等一起来使用
  • 3、如果是get请求可以继承mixins.ListModelMixin, mixins.RetrieveModelMixin, viewsets.GenericViewSet
  • 4、如果是post提交可以是mixins.CreateModelMixin, viewsets.GenericViewSet
  • 5、如果需要修改数据是mixins.UpdateModelMixin,viewsets.GenericViewSet
  • 6、如果是删除数据是mixins.DestroyModelMixin,viewsets.GenericViewSet
  • 7、比如get请求,查看源码,我们可以重写retrieve这个方法

    class AuthorViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, viewsets.GenericViewSet):
        queryset = Author.objects.all()
        serializer_class = AuthorSerializer
    
        def list(self, request, *args, **kwargs):
            // 获取参数
            print(self.request.query_params['name'])
            queryset = self.filter_queryset(self.get_queryset().filter(author=self.request.query_params['name']))
    
            page = self.paginate_queryset(queryset)
            if page is not None:
                serializer = self.get_serializer(page, many=True)
                return self.get_paginated_response(serializer.data)
    
            serializer = self.get_serializer(queryset, many=True)
            return Response(serializer.data)
  • 8、mixins.ListModelMixin是获取列表的

  • 9、mixins.RetrieveModelMixin可以获取详情