Django Rest Framework url注册器组件 | 响应器组件 | 分页器组件
文章参考博主:https://www.cnblogs.com/li-li/p/10103918.html
1.url注册器组件 :
通过DRF的视图组件,数据接口逻辑被我们优化到最后剩下一个类,接下来,我们使用DRF的url控制器来帮助我们自动生成url
'''3.使用url注册器组件的url''' #导入模块 from rest_framework import routers router = routers.DefaultRouter() # 3.将需要自动生成url的接口注册到router中 router.register('book', views.BookView) # router.register('user',views.UserView) # 4.生成url urlpatterns = [ re_path('^', include(router.urls)), re_path(r'user/$',views.UserView.as_view()), ]
2.响应器组件:
之前我们使用DRF的Response类来将数据响应给客户端,不管是POSTMAN还是浏览器,都能浏览到经过格式化后的漂亮的数据,DRF是怎么做的呢?其实就是通过响应器组件。
如果我们不需要使用DRF提供给浏览器的格式化后的数据,只需要禁止该响应方式即可:
from rest_framework.renderers import JSONRenderer class BookView(ModelViewSet): renderer_classes = [JSONRenderer] queryset = Book.objects.all() serializer_class = BookSerializer
这样,浏览器再次访问,接收到的就是普通的json格式数据,而不是经过DRF格式化后的数据,renderer_classes的查找逻辑与之前的解析器等组件是完全一样的。
4.分页器组件:
为了服务器性能考虑,也为了用户体验,我们不应该一次将所有的数据从数据库中查询出来,返回给客户端浏览器,如果数据量非常大,这对于服务器来讲,可以说是性能灾难,而对于用户来讲,加载速度将会非常慢。
所以,我们需要控制每次返回给客户端多少数据,这就需要用到分页器。
1、接下来,介绍一下DRF的局部实现分页器组件
# 1.导入模块 from rest_framework.pagination import PageNumberPagination # 自定义分页器类,继承PageNumberPagination class MyPagination(PageNumberPagination): page_size = 3 page_query_param = 'p' page_size_query_param = 'size' max_page_size = 5 class BookView(APIView): def get(self, request): # 2.获取数据 queryset = Book.objects.all() # 3.创建分页器对象 paginater = MyPagination() # 4.开始分页 paged_books = paginater.paginate_queryset(queryset, request) # 5.将分页后的数据进行序列化 serializer_books = BookSerializer(paged_books, many=True) # 6.返回数据 return Response(serializer_books.data)
2、参数介绍
page_size:用来控制每页显示多少条数据(全局参数名为PAGE_SIZE); page_query_param:用来提供直接访问某页的数据; page_size_query_param:临时调整当前显示多少条数据; max_page_size:控制page_size_query_param参数能调整的最大条数;
3、在ModelViewSet中使用分页器
from rest_framework.viewsets import ModelViewSet from rest_framework.pagination import PageNumberPagination # 自定义分页器类 class MyPagination(PageNumberPagination): page_size = 3 page_query_param = 'p' page_size_query_param = 'size' max_page_size = 5 class BookView(ModelViewSet): pagination_class = MyPagination # 指定分页器类 queryset = Book.objects.all() serializer_class = BookSerializer
4、分页器全局配置
REST_FRAMEWORK = { 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination', 'PAGE_SIZE': 10 # 每页数目 }