DRF 分页器的使用

这篇具有很好参考价值的文章主要介绍了DRF 分页器的使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

drf提供了三个内置分页器,根据前端需求选择使用。

全局配置

在配置文件中设置全局的分页方式,如:

REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS':  'rest_framework.pagination.PageNumberPagination',
    'PAGE_SIZE': 100  # 每页数目
}

也可通过继承内置的分页器类自定义Pagination类,来为视图添加不同分页器。在视图中通过pagination_clas属性来指明。

class LargeResultsSetPagination(PageNumberPagination):
    page_size = 10
    page_query_param = 'page'
    page_size_query_param = 'size'
    max_page_size = 30
    
class BookDetailView(RetrieveAPIView):
    queryset = BookInfo.objects.all()
    serializer_class = BookInfoSerializer
    pagination_class = LargeResultsSetPagination		# 局部指定使用分页器

注意:视图内局部设置不使用分页器

pagination_class = None

内置分页器的使用有两种方式,

  • 一种是直接使用内置的,在全局配置分页器的属性参数,控制分页的效果。
  • 一种是继承内置的分页器类,在继承的子类中设置分页器的属性参数,控制分页效果。

上述配置方式适用于内置的即继承内置的所有分页器的使用。需要注意的是基于APIView的视图需要自己手动添加分页器对象;基于ListAPIView的视图(继承GenericAPIView和视图插件的视图类以及视图集合类都可使用)仅通过参数pagination_class配置分页器即可使用。

PageNumberPagination

前端访问网址形式:

GET  http://127.0.0.1:8000/students/?page=4

可以在子类中定义的属性:

  • page_size 每页数目
  • page_query_param 前端发送的页数关键字名,默认为”page”
  • page_size_query_param 前端发送的每页数目关键字名,默认为None
  • max_page_size 前端最多能设置的每页数量
# APIView
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)
      
# ListAPIView
# 声明分页的配置类,即可使用
from rest_framework.pagination import PageNumberPagination
class StandardPageNumberPagination(PageNumberPagination):
   
    page_size = 2
    page_size_query_param = "size"
    max_page_size = 10
    page_query_param = "p"

class StudentAPIView(ListAPIView):
    queryset = Student.objects.all()
    serializer_class = StudentModelSerializer
    pagination_class = StandardPageNumberPagination		
# 127.0.0.1/four/students/?p=1&size=5

LimitOffsetPagination

前端访问网址形式:

GET http://127.0.0.1/four/students/?limit=100&offset=400

可以在子类中定义的属性:

  • default_limit 默认限制,默认值与PAGE_SIZE设置一直
  • limit_query_param limit参数名,默认’limit’
  • offset_query_param offset参数名,默认’offset’
  • max_limit 最大limit限制,默认None
# APIView
# 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)
    
#ListAPIView
from rest_framework.pagination import LimitOffsetPagination
class StandardLimitOffsetPagination(LimitOffsetPagination):
    # 默认每一页查询的数据量,类似上面的page_size
    default_limit = 2
    limit_query_param = "size"
    offset_query_param = "start"

class StudentAPIView(ListAPIView):
    queryset = Student.objects.all()
    serializer_class = StudentModelSerializer
    # 调用页码分页类
    # pagination_class = StandardPageNumberPagination
    # 调用查询偏移分页类
    pagination_class = StandardLimitOffsetPagination

CursorPagination

这种分页方式只有上一页和下一页,不能跳跃切换页面,但是查询效率极高。

前端访问网址形式:

GET http://127.0.0.1/four/students/?cursor=cD0xNQ%3D%3D

可以在子类中定义的属性:文章来源地址https://www.toymoban.com/news/detail-437420.html

  • cursor_query_param:默认查询字段,不需要修改
  • page_size:每页数目
  • ordering:按什么排序,需要指定,逆序在字段前加负号:ordering='-id'
#APIView
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)
    
    
# ListAPIView
class MyCursorPagination(CursorPagination):
    page_size=2
    ordering='-id'	
from rest_framework.generics import ListAPIView
class AuthorListView(ListAPIView):
    serializer_class = serializers.AuthorModelSerializer
    queryset = models.Author.objects.filter(is_delete=False)
    pagination_class =MyCursorPagination

到了这里,关于DRF 分页器的使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Vue电商项目--分页器制作

    分页这个组件,不单单是一个页面用到了。多个页面同时用它,因此我们可以封装成一个全局组件 需要将这个分页结构拆分到components  通用的分页组件Pagination  然后全局的注册这个组件  有点小问题,改一下。让它上一页在1前面,和居中  这里要注意的一点就是这个newOrde

    2024年02月06日
    浏览(32)
  • vue 分页器组件+css动画效果

    全网都找了一遍没有找到符合UI需求的分页动画,于是就主动上手了 需求: 1、分页最多显示9页,总页数最多显示无上限; 2、点击下一页的时候需要有动画效果过度,如果当前页数是当前显示最后的一页,则停了当前显示最后的位置,但是点击下一页的时候需要用户感知 效

    2024年02月09日
    浏览(41)
  • elementui 分页器,el-pagination 不显示的问题

    今天敲代码遇到了个很操蛋的问题,我把分页器封装成共用组件,一个组件显示分页器,另一个组件不显示分页器,我心想这么邪门的吗,这个是正常组件 这个组件不显示 然后我尝试把传给分页器的参数打印出来, 果然发现了操蛋的地方,这是正常显示的数据 这是不显示的

    2024年02月12日
    浏览(49)
  • element-UI 分页器Bug,切换页码,页码改变但是页码高亮未变化

    Element-UI提供了分页器的两个方法,handleSizeChange和handleCurrentChange,然而在实际使用中,却发现再切换页面展示数量的时候,会出现一些BUG, 页面刷新了,高亮页码却还是上次选择的页面。可以用以下方法解决; 翻看element文档中发现有current-page,当前页数,支持 .sync 修饰符

    2024年02月16日
    浏览(34)
  • DRF03-权限与分页

    创建一个新的子应用 opt 注册子应用 总路由,代码: 子路由,代码: 因为接下来的认证组件中需要使用到登陆功能,所以我们使用django内置admin站点并创建一个管理员. admin运营站点的访问地址:http://127.0.0.1:8000/admin 创建管理员以后,访问admin站点,先修改站点的语言配置

    2024年02月09日
    浏览(42)
  • spring使用内置jetty创建提供http接口服务

    通过mvc:annotation-driven/配置,Spring MVC会启用对注解的支持,使得可以在控制器类和方法上使用注解来定义请求映射、参数绑定等操作。 具体来说,mvc:annotation-driven/会启用以下功能: 支持@Controller注解,用于标识控制器类 支持@RequestMapping注解,用于定义请求映射 支持@RequestP

    2024年04月15日
    浏览(39)
  • 七、Django DRF框架GenericAPIView--搜索&排序&分页&返回值

    上一章: 六、DRF框架APIView--requestresponse解析器渲染器_做测试的喵酱的博客-CSDN博客 下一章: APIView 继承 View GenericAPIView 继承 APIView。 GenericAPIView 功能:     a.具备View的所有特性     b.具备了APIView中的认证、授权、限流功能     c.还支持对于获取列表数据接口的功能:搜索

    2024年02月08日
    浏览(66)
  • 解决:element-ui分页器在将最后一页列表数据删完时,页面不刷新到最新数据

    一、问题: 在用element-ui分页器的时候,我将最后一页列表数据删完了,但是页面没刷新到最新数据。正常情况是,我删完最后一页数据后,分页器停留在上一页,并刷新列表数据,以下是删完后的页面展现 网络返回的数据说明 :(pageNo:当前页 pageSize:当前页展示的条数

    2024年02月20日
    浏览(38)
  • 关于element-ui的分页器设置每一页显示数量(page-size)后页码并没有变化的问题与解决

    问题:element-ui的分页器在设置后,总页面数异常,不匹配总条数与单页显示数,设置page-size后页面也无变化 对应的参数:   对应的样式: 原因: page-size设置的值,是page-sizes数组中有的值,如果page-size的数值是page-sizes的数组里面没有值的,那么就会默认取page-sizes当中的第一个

    2024年02月11日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包