上一章节我们讲了
serializers
层的各种写法,本章介绍view
层的写法
一、使用APIView
的写法见上一章节
二、使用mixins
和generics
书写视图层
- 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), ]
六、viewsets
和router
结合使用
- 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
可以获取详情