分页器(三种)如何使用*****
1 内置了三种分页器 -PageNumberPagination:普通分页 -LimitOffsetPagination:偏移分页 -CursorPagination:游标分页 2 APIView和GenericAPIView+ListModelMixin 3 GenericAPIView+ListModelMixin的分页模式 4 PageNumberPagination:普通分页(用的最多) -page_size = api_settings.PAGE_SIZE # 每页显示多少条 -page_query_param = 'page' # 查询参数 -page_size_query_param = size # 查询的时候指定每页显示多少条 -max_page_size = 10 # 每页最多显示多少条 -使用方式: -定义一个类,继承PageNumberPagination -重写四个属性 -在继承了GenericAPIView+ListModelMixin视图类中配置 pagination_class = MyPageNumberPagination -查询 http://127.0.0.1:8000/students/?page=1&size=5
示例:
from rest_framework.pagination import PageNumberPagination as DRFPageNumberPagination
class PageNumberPagination(DRFPageNumberPagination):
page_size = 20
page_query_param = 'page'
max_page_size = 20
page_size_query_param = 'page_size'
5 LimitOffsetPagination:偏移分页 -default_limit = api_settings.PAGE_SIZE # 默认条数 -limit_query_param = 'limit' # 查询时,指定查询多少条 -offset_query_param = 'offset' # 查询时,指定的起始位置是哪 -max_limit = None # 查询时,最多返回多少条 -使用方式: -定义一个类,继承LimitOffsetPagination -重写四个属性 -在继承了GenericAPIView+ListModelMixin视图类中配置 pagination_class = MyPageNumberPagination -查询 http://127.0.0.1:8000/students/?limit=100&offset=1 6 CursorPagination:游标分页(速度块) -cursor_query_param = 'cursor' # 查询的时候,指定的查询方式 -page_size = api_settings.PAGE_SIZE # 每页显示多少条 -ordering = '-created' # 排序方式 -page_size_query_param = size # 查询的时候指定每页显示多少条 -max_page_size = None #每页最多显示多少条 -使用方式: -定义一个类,继承LimitOffsetPagination -重写四个属性 -在继承了GenericAPIView+ListModelMixin视图类中配置 pagination_class = MyPageNumberPagination -查询 http://127.0.0.1:8000/students/?limit=100&offset=1 7 APIView的分页模式 -新建一个类,继承普通分页,重写四个属性 -视图类写法如下 class StudentApiView(APIView): def get(self,request): student_list=Student.objects.all() page=MyPageNumberPagination()# 实例化得到对象 # 只需要换不同的分页类即可 res=page.paginate_queryset(student_list,request,self)# 开始分页 ser=StudentSerializer(res,many=True) return page.get_paginated_response(ser.data) # 返回数据
示例:
# 事件过滤 def get(self, request): params = request.query_params event = search_events(request, params) page_class = PageNumberPagination() page_set = page_class.paginate_queryset(queryset=event, request=request) ser = serializer.ScreenSerializer(instance=page_set, many=True) res_data = page_class.get_paginated_response(ser.data) return res_data
解读:
获取请求中的查询参数:从 request.query_params 中提取客户端传入的所有查询参数。 搜索事件:调用名为 search_events 的函数,该函数接受请求对象和查询参数作为输入,返回满足条件的事件查询集(queryset)。 分页设置:创建一个 PageNumberPagination 类的实例(page_class),这是 Django REST Framework 提供的一个分页器类。然后通过调用 paginate_queryset 方法对查询集进行分页处理,它会根据请求信息(如当前页数、每页条目数等)返回当前页面所需的事件子集。 序列化:使用 ScreenSerializer 将分页后的查询集实例序列化为 JSON 格式的数据,由于分页后得到的是一个列表,所以需要指定 many=True 参数。 构建分页响应:调用分页器实例的 get_paginated_response 方法,将序列化后的数据包装成包含分页信息的响应数据结构,如总页数、当前页码、下一页链接等。 返回响应:最后返回包含了分页数据和元数据的响应给客户端
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南