34.Django_类视图_GenericAPIView_过滤引擎_分页

本文介绍了如何在Django中使用类视图GenericAPIView进行分页操作。首先,讨论了Django内置的三种分页方式,重点讲解了根据页数进行分页的实现,包括全局设置分页引擎和在视图类中指定分页引擎。接着,文章探讨了自定义分页类的需求,如自定义每页显示数量,并提供了实现自定义分页类的步骤和代码示例。
摘要由CSDN通过智能技术生成

常见的需求:分页返回查询到的结果

一、pagination分页类

使用rest framework官方的pagination分页引擎,提供了三种分页类:
1.PageNumberPagination:根据页数进行分页
2.LimitOffsetPagination:根据偏移量进行分页
3.CursorPagination:根据游标进行分页

二、PageNumberPagination:根据页数进行分页

2.1 指定全局分页引擎

  1. settting.py中,指定全局分页引擎和每页返回的条数
REST_FRAMEWORK = {
"DEFAULT_RENDERER_CLASSES": (
        "rest_framework.renderers.JSONRenderer",
        "rest_framework.renderers.BrowsableAPIRenderer",
    ),
    # 设置全局过滤引擎
    'DEFAULT_FILTER_BACKENDS':[
    'rest_framework.filters.OrderingFilter',
    'django_filters.rest_framework.backends.DjangoFilterBackend'
],
    # 设置全局分页引擎
    'DEFAULT_PAGINATION_CLASS':{
    # 设置分页引擎
    'rest_framework.pagination.PageNumberPagination'
    # 指定每页返回的条数
    'PAGE_SIZE':3,
    }
}
  1. 在视图类中使用分页引擎
    步骤:
  • a.先使用过滤引擎
  • b.再使用分页引擎
    使用之前使用了过滤引擎的获取所有projectget方法进行示例

3 .请求该接口url
如果不指定页数,那么默认是第一页

http://xxx.xx.com/page==页数或者http://xxx.xx.com/?page=页数

比如:

# 查询name=测试的第二页数据
http -v http://xxx/porojects/ name==测试 page=2
http -v http://xxx/porojects/?name==测试?page=2

2.2 在视图类中,指定分页引擎

  1. 在视图类指定分页引擎
# 1.导包
from rest_framework.pagination import PageNumberPagination
# 2.指定分页引擎
pagination_class = PageNumberPaginationManual
  1. 该视图类的其它代码如上面的2.1的2

三、自定义分页类

1.1 有这么几个需求

  1. 想要自定义页数的key,不想为page,比如为currpage
  2. 想要前端自己想要每页显示多少页,就自己传递值过来,并且keypagesize

1.2 方法:

写一个新的类,继承PageNumberPagination类,在这个类的基础上进行修改

from rest_framework.pagination import PageNumberPagination
class PageNumberPaginationManual(PageNumberPagination):
   # 当前页数的key从page修改为currpage
    page_query_param = 'currpage'
    # 默认每页显示的条数为2;page_size也是请求时的key
    page_size = 2
    # 把page_size修改为pagesize
    page_size_query_param = 'pagesize'
    # 分页的最大的page_size,每页不能显示超过50条
    max_page_size = 50

1.3 步骤:

在项目的util目录,创建一个名为pagination.py的文件
需求如上面所述,代码如下
settting.py中,指定全局分页引擎,无需指定每页返回条数,由前端传参决定

REST_FRAMEWORK = {    
"DEFAULT_RENDERER_CLASSES": (
        "rest_framework.renderers.JSONRenderer",
        "rest_framework.renderers.BrowsableAPIRenderer",
    ),
    # 设置全局过滤引擎
    'DEFAULT_FILTER_BACKENDS':[
    'rest_framework.filters.OrderingFilter',
    'django_filters.rest_framework.backends.DjangoFilterBackend'
],
    # 设置全局分页引擎
    'DEFAULT_PAGINATION_CLASS':(
    # 设置自定义的分页引擎
    'utils.PageNumberPaginationManual'
)
}
  1. 请求该接口url
    注意,上面设置了每页最多只能返回50条数据,所以pagesize不能大于50
# 查询name=测试,第二页,每页显示4条(也就是得到第5-8条)
http -v http://xxx/porojects/?name==测试&currpage=2&pagesize=4
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值