一、分页组件

1、PageNumberPagination

a、全局配置

导入模块

from rest_framework.pagination import PageNumberPagination

在视图类中配置

def get(self, request):
   # 注意:数据quweyset
book_list = Book.objects.get_queryset().order_by('pk')
# 实例化
pnp = PageNumberPagination()
# 调用方法
pnp_list = pnp.paginate_queryset(book_list, request, self)
book_serialize = BookModelSerialize(pnp_list, many=True, context={'request': request})
return Response(book_serialize.data)

在配置文件中,修改全局page_size

REST_FRAMEWORK = {
'PAGE_SIZE': 1,
}

注意:queryset,book_list

b、局部分页

自定义分页类,继承PageNumberPagination

class MyPageNumberPagination(PageNumberPagination):
page_size = 1
page_query_param = 'page'
# 临时分页的参数 size=当前页面显示的数量
page_size_query_param = 'size'
# 临时分页size的最大值
max_page_size = 3

视图类

class BookView(APIView):
# parser_classes = [JSONParser]
# 查看书籍, 返回所有数据(书籍信息)
def get(self, request):
# 获取book的所有数据
book_list = Book.objects.get_queryset().order_by('pk')
# 实例化对象
pnp = MyPageNumberPagination()
pnp_list = pnp.paginate_queryset(book_list, request, self)
book_serialize = BookModelSerialize(pnp_list, many=True)
return Response(book_serialize.data)

2、LimitOffsetPagination

导入模块

from rest_framework.pagination import LimitOffsetPagination

a、全局设置和上面相似,具体看源码

b、局部设置

分页类

class MyLimitOffsetPagination(LimitOffsetPagination):
default_limit = 1
# limit 分页 limit=n ,一页有n条数据
limit_query_param = 'limit'
# offset 偏移的数据量 offset=n,从第n条数据开始分页
offset_query_param = 'offset'

视图类

class BookView(APIView):
# parser_classes = [JSONParser]
# 查看书籍, 返回所有数据(书籍信息)
def get(self, request):
# 获取book的所有数据
book_list = Book.objects.get_queryset().order_by('pk')
# 实例化对象
pnp = MyLimitOffsetPagination()
pnp_list = pnp.paginate_queryset(book_list, request, self)
book_serialize = BookModelSerialize(pnp_list, many=True)
return Response(book_serialize.data)

注意:limit是每页的数据量,offset是从第几条数据开始分页,不包含此条数据

3、终极视图组件分页

a、局部

注意:认证、权限可以有多个,分页器只能有一个

class AuthorViewSet(viewsets.ModelViewSet):
# permission_classes = [PermissionSet]
# authentication_classes = [ModelToken]
pagination_class = MyLimitOffsetPagination
queryset = Author.objects.all()
serializer_class = AuthorModelSerializer

b、全局

REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS': 'app01.components.Pagination.MyPageNumberPagination'
}

设置局部无分页

pagination_class = PageNumberPagination

源码解析

ModelViewSet -> mixins.ListModelMixin -> paginate_queryset

ModelViewSet => GenericViewSet -> generics.GenericAPIView -> paginate_queryset -> paginator -> pagination_class() -> api_settings.DEFAULT_PAGINATION_CLASS

3.CursorPagination (加密分页)

分页器

class MyCursorPagination(CursorPagination):
cursor_query_param = 'cursor'
page_size = 1
ordering = '-id' # 重写要排序的字段

视图

class ArticleList(APIView):
def get(self, request, *args, **kwargs):
res = {"code": 0}
article_list = models.Article.objects.all().order_by("id")
# 分页
page_obj = MyCursorPagination()
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)
return page_obj.get_paginated_response(res)

二、相应器

restframework 自定义的

from rest_framework.response import Response

注意:在浏览器和postman显示数据的格式不一样

最新文章

  1. SYSTEM表空间AUD$使用空间过大问题处理
  2. Update DN with Procedure
  3. 免费的HTML5连载来了《HTML5网页开发实例详解》连载(六)媒体查询
  4. js事件监听机制(事件捕获)总结
  5. 9.5noip模拟试题
  6. IO-02
  7. WPF 命令的简单总结
  8. 最全ajax函数
  9. 前段验证框架 formValidator
  10. SQL Server数据库的存储过程中定义的临时表,真的有必要显式删除临时表(drop table #tableName)吗?
  11. html查看器android
  12. Head First设计模式之单例模式
  13. css坑了我一下下之line-height
  14. Ambari:Provide ability to apply single patches on top of RU release
  15. Linux安装JDK.8
  16. Civil 3D 二次开发 名称模板不能正常工作
  17. 【Beta Scrum】冲刺! 1/5
  18. NSTimer深入理解
  19. go语言学习-接口
  20. 01.Java 开发简单的计算器

热门文章

  1. H3C STP基本配置
  2. Online Classification
  3. CodeForces - 721D Maxim and Array (贪心)
  4. js window.open 页面之间的通讯(不同源)
  5. SPA+.NET Core3.1 GitHub第三方授权登录 使用AspNet.Security.OAuth.GitHub
  6. JNDI数据源的使用
  7. 阿里面试官让我讲讲Unicode,我讲了3秒说没了,面试官说你可真菜
  8. c++简单实现循环队列
  9. $SCOI2009\ windy$数 数位$dp$
  10. Linux三剑客之sed的基本用法介绍