DRF分页器(Django Restful Framework)

资料推荐

官方文档
https://q1mi.github.io/Django-REST-framework-documentation/api-guide/pagination_zh/
B站没有好的教学视频,不建议看,直接看官方文档吧。

PageNumberPagination

此分页样式接受请求查询参数中的单个数字页码。
Request:

GET https://api.example.org/accounts/?page=4

Response:

{"count": 1023"next": "https://api.example.org/accounts/?page=5","previous": "https://api.example.org/accounts/?page=3","results": […]
}

Settings:

全局设置

全局启用 PageNumberPagination 样式,请使用以下配置,并根据需要设置 PAGE_SIZE

REST_FRAMEWORK = {'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination','PAGE_SIZE': 100
}

单视图设置(重点!)

自定义继承子类

自定义一个继承自PageNumberPagination的分页器,然后在里面设置page_size,如下:

class LargeResultsSetPagination(PageNumberPagination):page_size = 1000page_size_query_param = 'page_size' # 非必需max_page_size = 10000 # 非必需

重写get_paginate_by方法

如果只想用PageNumberPagination本身,那么需要通过重写get_paginate_by方法来设置page_size。

class YourView(generics.ListAPIView):queryset = YourModel.objects.all()serializer_class = YourSerializer# 使用官方的 PageNumberPagination 类pagination_class = PageNumberPagination# 覆盖默认的分页设置def get_paginate_by(self, queryset):return self.request.query_params.get('page_size', 5)

LimitOffsetPagination

这种分页样式反映了查找多个数据库记录时使用的语法。客户端包括“limit”和“offset”查询参数。limit指示要返回的项目的最大数目,这相当于其他样式中的 page_size。offset指示查询相对于完整的未分页项的起始位置。
Request:

GET https://api.example.org/accounts/?limit=100&offset=400

Response:

HTTP 200 OK
{"count": 1023"next": "https://api.example.org/accounts/?limit=100&offset=500","previous": "https://api.example.org/accounts/?limit=100&offset=300","results": […]
}

Settings:

全局设置

为了全局启用 LimitOffsetPagination样式,请使用以下配置:

REST_FRAMEWORK = {'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination','PAGE_SIZE': 10
}

ps:又是一个易错点,虽然limitoffsetpagination用的是limit,但是全局设置时还是要设置PAGE_SIZE。。

单视图设置(重点!)

自定义继承子类实现

自定义一个继承自LimitOffsetPagination的分页器,然后在里面设置limit,如下:

class CustomLimitOffsetPagination(LimitOffsetPagination):default_limit = 5  # 自定义默认每页显示的数量,一定要给max_limit = 20  # 自定义每页显示的最大数量,非必需

重写get_paginate_by

如果只想用LimitOffsetPagination本身,那么需要通过重写get_paginate_by方法来设置limit。

from rest_framework import generics
from rest_framework.pagination import LimitOffsetPaginationclass YourView(generics.ListAPIView):queryset = YourModel.objects.all()serializer_class = YourSerializerpagination_class = LimitOffsetPagination  # 使用 LimitOffsetPagination# 覆盖默认的分页设置def get_paginate_by(self, queryset):return self.request.query_params.get('limit', 10)

获取分页输出样式/具体如何使用分页器(重点!)

像是如上的

{"count": 1023"next": "https://api.example.org/accounts/?page=5","previous": "https://api.example.org/accounts/?page=3","results": […]
}
{"count": 1023"next": "https://api.example.org/accounts/?limit=100&offset=500","previous": "https://api.example.org/accounts/?limit=100&offset=300","results": […]
}

都是pagenumberpagination、limitoffsetpagination等官方分页器通过get_paginated_response返回的默认的分页样式。

具体使用如下:

class CustomLimitOffsetPagination(LimitOffsetPagination):default_limit = 5  # 自定义默认每页显示的数量class YourView(generics.ListAPIView):queryset = YourModel.objects.all()serializer_class = YourSerializerpagination_class = CustomLimitOffsetPagination  # 使用自定义分页类def get(self, request, *args, **kwargs):queryset = self.filter_queryset(self.get_queryset())page = self.paginate_queryset(queryset)  # 对查询集进行分页if page is not None:serializer = self.get_serializer(page, many=True)return self.get_paginated_response(serializer.data)  # 获取分页样式的响应serializer = self.get_serializer(queryset, many=True)return Response(serializer.data)

自定义分页输出样式(重写get_paginated_response方法!!重要!)

假设我们想用一个修改过的格式替换默认的分页输出样式,该格式在嵌套的“links”键中包含下一页和上一页的链接。我们就需要自定义分页器,并重写get_paginated_response方法

class CustomPagination(pagination.PageNumberPagination):def get_paginated_response(self, data):return Response({'links': {'next': self.get_next_link(),'previous': self.get_previous_link()},'count': self.page.paginator.count,'results': data})

最常使用场景举例

from rest_framework.pagination import LimitOffsetPaginationfrom utils import ThirdPartResponseclass TaskPagination(LimitOffsetPagination):default_limit = 5  # 自定义默认每页显示的数量,一定要给。及时后续会在请求参数中拿到limit,也一定要给def get_paginated_response(self, data):return ThirdPartResponse(data={"total": self.count, "data": data})@action(detail=False, methods=["get"], url_path="list-by-template/(?P<template_id>.+)")
def list_by_template(self, request, template_id=None):"""根据template_id过滤任务列表"""if template_id is None:message = "template_id is required"logger.error(message)return ThirdPartResponse(result=False, message=message)tasks = self.queryset.filter(template_id=template_id)paginator = TaskPagination()page = paginator.paginate_queryset(tasks, request)if page is not None:serializer = self.get_serializer(page, many=True)return paginator.get_paginated_response(serializer.data)serializer = self.get_serializer(tasks, many=True)return Response(serializer.data)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/45800.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【14】Github Copilot环境搭建

环境搭建 这里以Visual Studio Code为例&#xff0c;安装好vs code&#xff0c;打开扩展侧边菜单栏&#xff0c;搜索“Github Copilot”&#xff0c;会出现如下图的两个插件&#xff0c;点击安装第一个&#xff0c;另一个会附带一起安装&#xff0c;然后弹出提示重新启动vs co…

对于栈和链表,数组之间关系的一些探索

先贴脸来个图 这是一个解析图&#xff0c;总体是个栈&#xff08;stacks&#xff09;细分有数组和链表【注意这儿的linkedlist可不是Java集合List中的linklist】 对于栈&#xff0c;如果我们想向栈中添加元素&#xff0c;或者想从中删除元素&#xff0c;都必须从一个地方开始&…

阿里云DSW实例中安装并运行Neo4J

想尝试使用大模型对接Neo4J&#xff0c;在阿里云DSW实例中安装了Neo4J&#xff0c;却无法通过本地浏览器访问在DSW实例中运行的Neo4J。尝试了改neo4j.conf文件&#xff0c;以及添加专用网络的公共IP地址等方法&#xff0c;均没有成功。最后决定直接在服务器的命令行进行各种Cyp…

uniapp 页面字体乱码问题解决【已解决】

这个不是我们本身代码的问题&#xff0c;调整一下编译器就好了 打开编译器文件 2,然后以指定编码重新打开&#xff0c;选择utf-8就行了 非常简单 &#xff0c;如果你选择了之后重新渲染页面还是乱码的话&#xff0c;你就把项目关掉&#xff0c;重新启动就OK了。。。

从零开始学习嵌入式----结构体struct和union习题回顾

一、通过结构体和自定义函数实现成绩从大到小的排序&#xff0c;要求在主函数内定义结构体数组。 #include <stdio.h> //定义一个结构体类型 typedef struct Student {int age;char name[32];float score; } STU; //定义一个函数实现成绩从小到大的排序 void fun(STU *p…

基于搜索二叉树的停车收费管理系统

系统效果&#xff1a;录入汽车信息 查看汽车信息 收费信息查看 查询车库车辆 代码展示&#xff1a; //SearchBinaryTree.h #pragma once #include<iostream> #include<string> #include<time.h> #include<Windows.h> using namespace std;template<…

百分点科技入选《2024中国数据要素产业图谱1.0版》

近日&#xff0c;数据猿与上海大数据联盟发布了《2024中国数据要素产业图谱1.0版》&#xff0c;百分点科技凭借领先的数据科学技术和深入的行业洞察力&#xff0c;入选数据管理/治理、数据分析与挖掘、应急管理三大领域。 在数据要素的发展关键期&#xff0c;数据作为生产要素持…

Hadoop中的YARN组件

文章目录 YARN 的主要功能YARN 的架构YARN 的工作流程YARN 的优势总结 YARN&#xff08;Yet Another Resource Negotiator&#xff09;是 Hadoop 生态系统中的一个关键组件&#xff0c;负责资源管理和作业调度。它是 Hadoop 2.x 及更高版本中的核心模块&#xff0c;旨在提高集群…

【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【26】【内网穿透】cpolar

持续学习&持续更新中… 守破离 【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【27】【内网穿透】cpolar 内网穿透cpolar内网穿透联调配置练习—使用公网地址访问gulimall.com参考 内网穿透 正常的外网需要访问我们项目的流程是&#xff1a; 买服务器并且有公网固定…

怎么压缩视频文件?简单的压缩视频方法分享

视频已成为我们日常生活中不可或缺的一部分。但随着视频质量的提高&#xff0c;文件大小也逐渐成为我们分享的阻碍。如何有效压缩视频文件&#xff0c;使其既能保持清晰&#xff0c;又能轻松分享&#xff1f;今天&#xff0c;给大家分享五种实用的视频压缩方法&#xff0c;快来…

简谈设计模式之适配器模式

适配器模式是结构型设计模式之一, 用于将一个类的接口转换成客户期望的另一个接口. 通过使用适配器模式, 原本由于接口不兼容而无法一起工作的类可以协同工作 适配器模式通常有两种实现方式 类适配器模式 (Class Adapter Pattern&#xff09;: 使用继承来实现适配器。**对象适…

安装adb和常用命令

下载ADB安装包 https://dl.google.com/android/repository/platform-tools-latest-windows.zip 解压安装包 解压如上下载的安装包&#xff0c;然后复制adb.exe所在的文件地址 配置环境变量 我的电脑——>右键属性——>高级系统设置——>环境变量——>系统变量—…

stm32学习:(寄存器1)控制寄存器来让led亮

开启时钟&#xff0c;先查找到开启时钟的寄存器&#xff0c;然后通过该寄存器操作时钟的开启或关闭&#xff0c;要打开的是GPIOA的时钟 在芯片手册&#xff0c;找到RCC寄存器描述章节找到APB2外设时钟使能寄存器&#xff08;RCC_APB2ENR)&#xff0c;现在算RCC_APB2ENR这个寄存…

基于mcu固件反汇编逆向入门示例-stm32c8t6平台

基于mcu固件反汇编逆向入门示例-stm32c8t6平台 本文目标&#xff1a;基于mcu固件反汇编逆向入门示例-stm32c8t6平台 按照本文的描述&#xff0c;应该可以在对应的硬件上通实验并举一反三。 先决条件&#xff1a;拥有C语言基础&#xff0c;集成的开发环境&#xff0c;比如&am…

ES6及ESNext规范

1、let 和 const 而let引入了块级作用域的概念, 创建setTimeout函数时&#xff0c;变量i在作用域内。对于循环的每个迭代&#xff0c;引用的i是i的不同实例。 暂时性死区&#xff1a;不允许变量提升 const就很简单了, 在let的基础上, 不可被修改 js 代码解读 for(var i0;i<…

《背包乱斗》为什么好玩 苹果电脑怎么玩《背包乱斗》游戏 mac怎么玩steam windows游戏

在当今竞争激烈的游戏市场中&#xff0c;《背包乱斗》以其独特的魅力在众多作品中脱颖而出&#xff0c;吸引了大量玩家的关注和喜爱。其创新的游戏机制和不断迭代的内容&#xff0c;加之出色的视觉效果和社区建设&#xff0c;使其成为了游戏界的一股清流。 一、《背包乱斗》为…

Hadoop学习记录一

HDFS&#xff08;Hadoop Distributed File System&#xff09;是Hadoop项目的一部分&#xff0c;用于存储海量数据。HDFS设计为可以在廉价硬件上运行&#xff0c;同时提供高容错性。HDFS主要由三个关键角色组成&#xff1a;NameNode、DataNode和SecondaryNameNode。下面我用大白…

《绝区零》是一款什么类型的游戏,Mac电脑怎么玩《绝区零》苹果电脑玩游戏怎么样

米哈游的《绝区零》最近在网上爆火呀&#xff0c;不过很多人都想知道mac电脑能不能玩《绝区零》&#xff0c;今天麦麦就给大家介绍一下《绝区零》是一款什么样的游戏&#xff0c;Mac电脑怎么玩《绝区零》。 一、《绝区零》是一款什么样的游戏 《绝区零》是由上海米哈游自主研发…

Web前端-Web开发HTML基础1-input

一. 基础 1. 写一个输入框代码&#xff0c;类型为密码&#xff1b; 2. 写一个输入框代码&#xff0c;类型为密码&#xff1b; 3. 写一个输入框代码&#xff0c;类型为密码&#xff0c;名称为"password"&#xff1b; 4. 写一个输入框代码&#xff0c;类型为密码&#…

ES快速开发,ElasticsearchRestTemplate基本使用以及ELK快速部署

最近博主有一些elasticsearch的工作&#xff0c;所以更新的慢了些&#xff0c;现在就教大家快速入门&#xff0c;并对一些基本的查询、更新需求做一下示例&#xff0c;废话不多说开始&#xff1a; 1. ES快速上手 es下载&#xff1a;[https://elasticsearch.cn/download/]()这…