news 2026/6/18 16:45:06

DRF的分页讲解-代码篇 PageNumberPagination类的两种使用方式

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
DRF的分页讲解-代码篇 PageNumberPagination类的两种使用方式

本文讲述PageNumberPagination类的两种用法

一、全局配置分页

前期准备工作:一个配置drf框架的django项目

1. 在配置文件中添加下述代码

代码解析:指定全局分页器为PageNumberPagination,且每页显示5条数据

作用:只要继承了 from rest_framework.generics 模块下的 GenericAPIView 类 (无论直接间接)自动获取分页能力

# settings.py # REST Framework 配置 REST_FRAMEWORK = { # 对所有分页器生效,但优先级低 "DEFAULT_PAGINATION_CLASS": "rest_framework.pagination.PageNumberPagination", "PAGE_SIZE": 5, # 每页显示5条数据 }

2. 视图类代码如下

这里以ListAPIView为例

# views.py from rest_framework.generics import ListAPIView from .models import Product from .serializers import ProductSerializer class ProductListView(ListAPIView): queryset = Product.objects.all() serializer_class = ProductSerializer

3. 路由类

from django.urls import path from .views import ProductListView urlpatterns = [ path('product/', ProductListView.as_view()), ]

4. 基路由类

from django.contrib import admin from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), path('api/', include('apps.filterapp.urls')) ]

5. 接口工具测试

使用接口工具测试下面的接口

注意:查询参数分别是 page、size 分别表示页码和数量

localhost:8001/api/product/?page=1&size=10

响应结果解析:

count = 25 表示数据库一共25条数据

next = http://localhost:8001/api/product/?page=2&size=5 表示下一页的访问链接

previous = null 表示上一页的访问链接 (但由于处于第一页没有上一页故为null)

result = [ {}, {}, {}, {}, {} ] 表示数据库中具体的数据

{ "count": 25, "next": "http://localhost:8001/api/product/?page=2&size=5", "previous": null, "results": [ { "id": 1, "name": "无穷辣条", "price": "23.49", "stock": 999, "status": "on_sale", "created_at": "2026-06-05T00:00:00Z", "category": 1 }, { "id": 2, "name": "卫龙大面筋", "price": "15.99", "stock": 500, "status": "on_sale", "created_at": "2026-06-10T00:00:00Z", "category": 1 }, { "id": 3, "name": "麻辣王子", "price": "18.50", "stock": 300, "status": "on_sale", "created_at": "2026-06-08T00:00:00Z", "category": 1 }, { "id": 4, "name": "亲嘴烧", "price": "12.80", "stock": 800, "status": "on_sale", "created_at": "2026-06-12T00:00:00Z", "category": 1 }, { "id": 5, "name": "魔芋爽", "price": "25.00", "stock": 450, "status": "on_sale", "created_at": "2026-06-15T00:00:00Z", "category": 1 } ] }

二、具体视图类中自定义分页器

先将全局配置文件中的drf关于分页的配置删去

1.新增pagination.py文件

自定义分页器其实就是继承PageNumberPagination类,并定义下面四个属性

from rest_framework.pagination import PageNumberPagination class ProductListPageNumberPagination(PageNumberPagination): """产品信息列表分页器""" page_size = 5 # 默认每页显示 5 条数据 max_page_size = 20 # 每页最多允许显示 20 条(即使客户端请求更大) page_size_query_param = "size" # 客户端可通过 ?size=10 动态指定每页数量 page_query_param = "page" # 客户端通过 ?page=2 请求第 2 页

2.视图类

视图类中指定自定义分页类

from rest_framework.generics import ListAPIView from .models import Product from .serializers import ProductSerializer from .paginations import ProductListPageNumberPagination class ProductListView(ListAPIView): queryset = Product.objects.all() serializer_class = ProductSerializer pagination_class = ProductListPageNumberPagination

3. 接口工具测试

localhost:8001/api/product/?page=1&size=6
{ "count": 25, "next": "http://localhost:8001/api/product/?page=2&size=6", "previous": null, "results": [ { "id": 1, "name": "无穷辣条", "price": "23.49", "stock": 999, "status": "on_sale", "created_at": "2026-06-05T00:00:00Z", "category": 1 }, { "id": 2, "name": "卫龙大面筋", "price": "15.99", "stock": 500, "status": "on_sale", "created_at": "2026-06-10T00:00:00Z", "category": 1 }, { "id": 3, "name": "麻辣王子", "price": "18.50", "stock": 300, "status": "on_sale", "created_at": "2026-06-08T00:00:00Z", "category": 1 }, { "id": 4, "name": "亲嘴烧", "price": "12.80", "stock": 800, "status": "on_sale", "created_at": "2026-06-12T00:00:00Z", "category": 1 }, { "id": 5, "name": "魔芋爽", "price": "25.00", "stock": 450, "status": "on_sale", "created_at": "2026-06-15T00:00:00Z", "category": 1 }, { "id": 6, "name": "可口可乐", "price": "3.40", "stock": 1999, "status": "draft", "created_at": "2026-04-04T00:00:00Z", "category": 2 } ] }

三、总结

虽然本文只讲了两种方式使用分页器,但是也要变通,我们自定义的分页器也可以作为全局的分页器进行使用。更多高级用法其实本质就是去重写分页器类的方法加入我们自己的逻辑。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/18 16:45:00

ReadCat:打造纯净阅读体验的完整开源解决方案

ReadCat:打造纯净阅读体验的完整开源解决方案 【免费下载链接】read-cat 一款免费、开源、简洁、纯净、无广告的小说阅读器 项目地址: https://gitcode.com/gh_mirrors/re/read-cat ReadCat是一款专注于提供极致阅读体验的开源小说阅读器,以其免费…

作者头像 李华
网站建设 2026/6/18 16:44:45

go java web开发 Java老手转Go开发:不是SpringBoot不香,是这玩意儿太爽了

奋斗在一线的 Java 开发人员小玖, 有着自己开发一个建站程序的打算, 由于某些缘由, 最终小玖把建站程序的开发语言选定为 Go。其实之前对于Go小玖并没有太多接触, 只能算是个初学者, 所以关于Go的WEB开发从初学角度总结经验, 期望日后能对初学Go语言的小伙伴有帮助, 不过本系列…

作者头像 李华
网站建设 2026/6/18 16:44:05

XY2100命令行工具:模块化与管道化设计提升数据处理效率

1. 项目概述:XY2100,一个被低估的“万金油”工具最近在整理手头的开源工具库,翻到了一个老伙计——XY2100。这名字听起来像某个神秘设备的型号,或者某个实验室的内部代号,以至于很多朋友第一次看到都会问:“…

作者头像 李华
网站建设 2026/6/18 16:41:23

Windows系统文件vcruntime140d.dll丢失找不到问题解决

在使用电脑系统时经常会出现丢失找不到某些文件的情况,由于很多常用软件都是采用 Microsoft Visual Studio 编写的,所以这类软件的运行需要依赖微软Visual C运行库,比如像 QQ、迅雷、Adobe 软件等等,如果没有安装VC运行库或者安装…

作者头像 李华
网站建设 2026/6/18 16:41:13

Selenium自动化测试面试核心:从WebDriver原理到框架集成实战

1. 项目概述:一份面试题的深度价值最近在整理资料时,翻出了几年前准备面试时收集和整理的一份关于Selenium的面试与笔试题集,其中不少题目来自当时字节跳动等一线互联网公司的考察点。时过境迁,虽然具体的题目可能已经更新&#x…

作者头像 李华
网站建设 2026/6/18 16:38:56

鸿蒙应用中的安全登录:RSA加密传输密码实践

在移动应用开发中,用户密码等敏感信息的安全传输至关重要。直接明文传输密码极易被中间人窃取。本文介绍如何利用鸿蒙的 cryptoFramework 及 RSA 公钥加密,实现客户端密码加密、服务端解密的完整登录注册流程。 完整代码:httpDemo。http模块负…

作者头像 李华