DRF分页组件
为什么要使用分页
我们数据表中可能会有成千上万条数据,当我们访问某张表的所有数据时,我们不太可能需要一次把所有的数据都展示出来,因为数据量很大,对服务端的内存压力比较大还有就是网络传输过程中耗时也会比较大。
通常我们会希望一部分一部分去请求数据,也就是我们常说的一页一页获取数据并展示出来。
DRF使用分页器
# 分页 class BookView(APIView): # authentication_classes = [TokenAuth,] # [TokenAuth(),] # permission_classes = [] # throttle_classes = [] # parser_classes = [JSONParser, FormParser] def get(self, request): print("request.user", request.user) print("request.auth", request.auth) print("_request.body", request._request.body) print("_request.GET", request._request.GET) book_list = Book.objects.all() # # 分页(原理) from rest_framework.pagination import PageNumberPagination pnp = PageNumberPagination() # 在序列化之前就进行分页 books_pag = pnp.paginate_queryset(book_list, request,self) bs = BookModelSerializers(books_pag, many=True) return Response(bs.data)
分页模式
rest framework中提供了三种分页模式:
DRF使用分页器
分页模式
rest framework中提供了三种分页模式:
from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination, CursorPagination
全局配置
REST_FRAMEWORK = { 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination', 'PAGE_SIZE': 100 }
局部配置
我们可以在视图类中进行局部设置
class PublisherViewSet(ModelViewSet): queryset = models.Publisher.objects.all() serializer_class = PublisherModelSerializer pagination_class = PageNumberPagination # 注意不是列表(只能有一个分页模式)
DRF内置分页器
PageNumberPagination
按页码数分页,第n页,每页显示m条数据
例如:http://127.0.0.1:8000/api/article/?page=2&size=1
分页器
class MyPageNumber(PageNumberPagination): page_size = 2 # 每页显示多少条 page_size_query_param = 'size' # URL中每页显示条数的参数 page_query_param = 'page' # URL中页码的参数 max_page_size = None # 最大页码数限制
视图
class ArticleList(APIView): def get(self, request, *args, **kwargs): res = {"code": 0} article_list = models.Article.objects.all().order_by("id") # 分页 page_obj = MyPageNumber() page_article = page_obj.paginate_queryset(queryset=article_list, request=request, view=self) ser_obj = ArticleSerializer(page_article, many=True) res["data"] = ser_obj.data return Response(res)
# 分页 from rest_framework.pagination import PageNumberPagination class MyPageNumberPagination(PageNumberPagination): page_size = 10 # 每页显示多少条 max_page_size = 10 # # 最大页码数限制 page_size_query_param = 'size' # URL中每页显示条数的参数 page_query_param = 'page' # URL中页码的参数 # 分页 class BookView(APIView): # authentication_classes = [TokenAuth,] # [TokenAuth(),] # permission_classes = [] # throttle_classes = [] # parser_classes = [JSONParser, FormParser] def get(self, request): book_list = Book.objects.all() # # 分页(原理) page_obj = MyPageNumberPagination() # # 在序列化之前就进行分页 # books_pag = pnp.paginate_queryset(book_list, request,self) books_pag = page_obj.paginate_queryset(queryset=book_list, request=request, view=self) bs = BookModelSerializers(books_pag, many=True) return Response(bs.data)
返回带页码链接的响应
class ArticleList(APIView): def get(self, request, *args, **kwargs): res = {"code": 0} article_list = models.Article.objects.all().order_by("id") # 分页 page_obj = MyPageNumber() page_article = page_obj.paginate_queryset(queryset=article_list, request=request, view=self) ser_obj = ArticleSerializer(page_article, many=True) res["data"] = ser_obj.data return page_obj.get_paginated_response(res)