Django REST Framework提供了三种分页器:python
说明:通常在分页前,须要先将数据排序。若是不排序,会报警告数据库
utils/pagination.py安全
from rest_framework.pagination import PageNumberPagination class MyPagination(PageNumberPagination): # 只须要作一些配置便可 page_size = 1 # 每页的数据量(默认) page_query_param = "page" # 请求参数中的 page参数名 page_size_query_param = "size" # 请求参数中的 page_size参数名 max_page_size = 3 # 每页最大数量,请求参数中若是超过了这个配置,不会报错,会按照此配置工做 须要说明的是:咱们配置的参数名,须要使用get请求。DRF在实现过程当中只是针对get获取参数,若是须要其余方式传递参数(如post),须要本身修改源码。
views.pypost
from utils.pagination import MyPagination class BookView(APIView): def get(self, request): book_list = Book.objects.all().order_by("id") # 实例化分页器对象 pageObj = MyPagination() # PageNumberPagination # 调用分页方法 page_query = pageObj.paginate_queryset(book_list, request, view=self) # 序列化器 many表示取出多条数据 ret = BookSeriallzer(page_query, myFields="__all__", many=True) print(ret) resIO = pageObj.get_paginated_response(ret.data) # 获取分页的结果,将分页后的结果数据与Response封装在一块儿 # 将数据分为count,next,prev,result。分别是数据总量,上一页/下一页的请求地址,本页的数据 return resIO
utils.pagination.py加密
class LimitPagination(LimitOffsetPagination): '''须要咱们规定:从第几条开始找,向后找多少条limit''' default_limit = 1 # 向后找几条的默认配置 limit_query_param = "limit" # 请求参数中的limit参数名 offset_query_param = "offset" # 请求参数中的offset参数名 max_limit = 3 # 最大的寻找条数 说明:参数的请求方法同上,get获取。
views.pyspa
from utils.pagination import LimitPagination class BookView(APIView): def get(self, request): book_list = Book.objects.all().order_by("id") # 实例化分页器对象 pageObj = LimitPagination() # LimitOffsetPagination # 调用分页方法 page_query = pageObj.paginate_queryset(book_list, request, view=self) # 序列化器 many表示取出多条数据 ret = BookSeriallzer(page_query, myFields="__all__", many=True) print(ret) resIO = pageObj.get_paginated_response(ret.data) # 获取分页的结果,将分页后的结果数据与Response封装在一块儿 # 将数据分为count,next,prev,result。分别是数据总量,上一页/下一页的请求地址,本页的数据 return resIO
游标分页。有时候,别人可以根据你的请求参数推断出你的数据库中有多少条数据,有些公司以为这不够安全。使用次分页方式能够将游标进行加密,令人没法获知数据的数目。rest
特色:对象
utils/pagination.pyblog
class CurPagination(CursorPagination): '''游标分页''' cursor_query_param = "cursor" # 游标请求参数,至关于page页数,但该数据是加密的,来自于上次分页返回 page_size = 2 # 默认每页显示的 ordering = "-id" # 排序 根据id倒序 max_page_size = 10 # 每页显示的最大条数
views.py排序
同上☝