Restful framework【第九篇】分页器
基本使用#
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | 分页 -简单分页 page_size = api_settings.PAGE_SIZE :每页显示条数 page_query_param = 'page' :查询的页码数 page_size_query_param = None :每页最大显示条数 -如果我要的数据是第一页显示10条:http://127.0.0.1:8000/books/?ccc=10&page=1 -如果我要的是第二页显示5条:http://127.0.0.1:8000/books/?ccc=5&page=2 max_page_size = 8 :控制最大显示多少条 -如果我想第一页显示10000条,这种不合理,通过这个参数控制,最大显示8条 -使用: page_sipmle=PageNumberPagination() page_sipmle.page_size=4 # page_sipmle.page_query_param='aaa' page_sipmle.page_size_query_param='ccc' page_sipmle.max_page_size=8 book_list = models.Book.objects.all() page_list = page_sipmle.paginate_queryset(book_list,request,self) book_ser = BookSerializer(instance=page_list, many=True) -偏移分页 default_limit = api_settings.PAGE_SIZE :默认偏移的条数 5 limit_query_param = 'limit' :偏移的条数 offset_query_param = 'offset' :是标杆 max_limit = None :最大偏移的条数 -举例 -http://127.0.0.1:8000/books/ 结果是:从1到5 -http://127.0.0.1:8000/books/?limit=7 结果是:从1到7 -http://127.0.0.1:8000/books/?limit=2&offset=6 结果是:从7到8,两条 -http://127.0.0.1:8000/books/?offset=6 结果是:从7到11,5条 -游标分页:原理:速度最快,但是只能往上一页和下一页走 cursor_query_param = 'cursor' page_size = api_settings.PAGE_SIZE :默认每页显示的条数 ordering = 'id' :按谁排序 |
简单分页(查看第n页,每页显示n条)#
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | from rest_framework.pagination import PageNumberPagination # url=url=http://127.0.0.1:8000/pager/?page=2&size=3,size无效 class Pager(APIView): def get(self,request,*args,**kwargs): # 获取所有数据 ret=models.Book.objects.all() # 创建分页对象 page=PageNumberPagination() # 在数据库中获取分页的数据 page_list=page.paginate_queryset(ret,request,view=self) # 对分页进行序列化 ser=BookSerializer1(instance=page_list,many=True) return Response(ser.data) # 二 自定制 url=http://127.0.0.1:8000/pager/?page=2&size=3 # size=30,无效,最多5条 class Mypage(PageNumberPagination): page_size = 2 page_query_param = 'page' # 定制传参 page_size_query_param = 'size' # 最大一页的数据 max_page_size = 5 class Pager(APIView): def get(self,request,*args,**kwargs): # 获取所有数据 ret=models.Book.objects.all() # 创建分页对象 page=Mypage() # 在数据库中获取分页的数据 page_list=page.paginate_queryset(ret,request,view=self) # 对分页进行序列化 ser=BookSerializer1(instance=page_list,many=True) # return Response(ser.data) # 这个也是返回Response对象,但是比基本的多了上一页,下一页,和总数据条数(了解即可) return page.get_paginated_response(ser.data) |
setting里
REST_FRAMEWORK = { # 每页显示两条 'PAGE_SIZE':2 }
路由:
url(r'^pager/$', views.Pager.as_view()),
Serializers
class BookSerializer1(serializers.ModelSerializer): class Meta: model=models.Book # fields="__all__" exclude=('authors',)
偏移分页(在第n个位置,向后查看n条数据)#
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | # http://127.0.0.1:8000/pager/?offset=4&limit=3 from rest_framework.pagination import LimitOffsetPagination # 也可以自定制,同简单分页 class Pager(APIView): def get(self,request,*args,**kwargs): # 获取所有数据 ret=models.Book.objects.all() # 创建分页对象 page=LimitOffsetPagination() # 在数据库中获取分页的数据 page_list=page.paginate_queryset(ret,request,view=self) # 对分页进行序列化 ser=BookSerializer1(instance=page_list,many=True) # return page.get_paginated_response(ser.data) return Response(ser.data) |
CursorPagination(加密分页,只能看上一页和下一页,速度快)#
思考:不重写类,修改类属性?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | from rest_framework.pagination import CursorPagination # 看源码,是通过sql查询,大于id和小于id class Pager(APIView): def get(self,request,*args,**kwargs): # 获取所有数据 ret=models.Book.objects.all() # 创建分页对象 page=CursorPagination() page.ordering='nid' # 在数据库中获取分页的数据 page_list=page.paginate_queryset(ret,request,view=self) # 对分页进行序列化 ser=BookSerializer1(instance=page_list,many=True) # 可以避免页码被猜到 return page.get_paginated_response(ser.data) |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架