首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >DRF分页

DRF分页

作者头像
zy010101
发布于 2021-12-17 20:29:57
发布于 2021-12-17 20:29:57
8290
举报
文章被收录于专栏:程序员程序员

DRF分页

REST framework提供了分页的支持,并允许在settings.py中进行全局配置,如下所示:

代码语言:javascript
复制
REST_FRAMEWORK = {
    # 解析器
    'DEFAULT_PARSER_CLASSES': [
        'rest_framework.parsers.JSONParser',
    ],
    # 全局分页配置
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',       # 分页类(控制分页样式)
    'PAGE_SIZE': 5,        # 页面大小
}

DRF的分页器提供了两种样式,PageNumberPagination和LimitOffsetPagination,下面来分别介绍。

LimitOffsetPagination

前端访问网址形式:

代码语言:javascript
复制
GET /book2/?limit=5&offset=5
GET /book2/?limit=5&offset=10
GET /book2/?limit=5&offset=15

可以看到是按照根据分页大小,然后计算偏移量来进行分页的。这里设置的页面大小是5,请求第二页就是GET /book2/?limit=5&offset=5,第三页就是GET /book2/?limit=5&offset=10, 以此类推。

我们也可通过自定义Pagination类,来实现自定义的分页行为,对于继承自LimitOffsetPagination的类,可以在类中定义的属性:

  • default_limit 默认限制,默认值与PAGE_SIZE设置一致
  • limit_query_param limit参数名,默认’limit’
  • offset_query_param offset参数名,默认’offset’
  • max_limit 最大limit限制,默认None

例如:

代码语言:javascript
复制
class PageNum2(LimitOffsetPagination):
    default_limit = 5  # 每页返回的条数
    limit_query_param = 'l'  # url中设置limit的键,默认为'limit'
    offset_query_param = 'o' # url中设置offset的键,默认为'offset'
    max_limit = 20   # 最大limit限制,默认为None

在视图中应用该分页:

代码语言:javascript
复制
class ListCreateAPI(ListCreateAPIView):
    """列表查询和新增功能"""
    queryset = BookInfo.objects.all().order_by('id')
    serializer_class = BookInfoSerializer
    pagination_class = PageNum2     # 分页

效果如下所示:

PageNumberPagination

前端访问网址形式:

代码语言:javascript
复制
GET /book2/?page=2
GET /book2/?page=3
GET /book2/?page=4

默认全局配置下,是按照页数来进行分页请求的。第一页是GET /book2/,第二页是GET /book2/?page=2,第三页是GET /book2/?page=3,依次类推。

我们也可通过自定义Pagination类,来实现自定义的分页行为,对于继承自PageNumberPagination的类,可以在类中定义的属性:

  • page_size 每页数目
  • page_query_param 前端发送的页数关键字名,默认为"page"
  • page_size_query_param 前端发送的每页数目关键字名,默认为None
  • max_page_size 前端最多能设置的每页数量

例如:

代码语言:javascript
复制
class PageNum(PageNumberPagination):
    """分页器类"""
    page_size = 5  # 默认每页返回的条数
    page_query_param = 'pagenum'     #url中设置 page 的键,默认为page
    page_size_query_param = 'pagesize'  # url中设置 page_size 的键,默认为None
    max_page_size = 50  # 每页返回的最大条数,默认为None

在视图中应用该分页:

代码语言:javascript
复制
class ListCreateAPI(ListCreateAPIView):
    """列表查询和新增功能"""
    queryset = BookInfo.objects.all().order_by('id')
    serializer_class = BookInfoSerializer
    pagination_class = PageNum     # 分页

效果如下所示:

参考资料: Pagination

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/12/17 ,如有侵权请联系 cloudcommunity@tencent.com 删除
目录
  • DRF分页
    • LimitOffsetPagination
    • PageNumberPagination
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档