【Django-ninja】分页管理器

2024-02-02 19:36
文章标签 django 分页 管理器 ninja

本文主要是介绍【Django-ninja】分页管理器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

django ninja通过@paginate装饰器即可进行分页。内置了两个分页管理器LimitOffsetPagination和PageNumberPagination,能够实现基本的分页要求。当内置分页器不满足要求时,可以继承PaginationBase进行扩展自己的分页管理器。 

1 使用分页器

from ninja.pagination import paginate@api.get('/users', response=List[UserSchema])
@paginate
def list_users(request):return User.objects.all()

/api/users?limit=10&offset=0

返回:

{
"items": [],
"count": 10
}

2 ninja自带分页器

2.1 LimitOffsetPagination

默认paginate使用的就是该分页器。

2.2 PageNumberPagination

@api.get("/users")
@paginate(PageNumberPagination, page_size=50)
def list_users(...

返回结果包含items和count

{
"items": [],
"count": 10
}

2.3 自定义分页器

这个自定义分页器定义了Input、Output、paginate_queryset。

实现了page和page_size参数获取数据。page_size可以通过多种方式进行调节。在定义接口的时候设置固定值,或者使用分页器的默认值,或者使用用户的传输参数。

返回结果,新增多个字段,修改默认items为data。

#!/usr/bin/env python
# coding=utf-8
# @Time    : 2024/2/2 15:40
# @Software: PyCharm
import math
from ninja import Schema
from ninja.pagination import PaginationBase
from typing import List, Any, Optionalclass CustomPagination(PaginationBase):def __init__(self, page_size: Optional[int] = None, **kwargs):""" 如果指定具体值,那么用户参数中的page_size将会失效。page_size: 在定义接口是可以设置的每页记录数。例如:@api.get("/book")@paginate(CustomPagination)def book_list(request):return Book.objects.all()@api.get("/book")@paginate(CustomPagination, page_size=10)  # 定义接口默认每页数量def book_list(request):return Book.objects.all()"""self.page_size = page_sizesuper().__init__(**kwargs)class Input(Schema):""" 输入参数,两个参数。1. page(必须2. page_size(可选)"""page: intpage_size: int = 5class Output(Schema):"""输出结果。1. data 数据集合2. total:总记录数3. per_page:每页记录数4. total_page:总页数5. page:当前页"""data: List[Any]  # <--- datatotal: intper_page: inttotal_page: intpage: intdef paginate_queryset(self, queryset, pagination: Input, **params):page = pagination.pagepage_size = self.page_size or pagination.page_sizestart_idx = (page - 1) * page_sizeend_idx = start_idx + page_sizetotal_count = queryset.count()return {'data': queryset[start_idx: end_idx],  # <--- data'total': total_count,'per_page': page_size,'total_page': math.ceil(total_count / page_size),'page': page}items_attribute: str = "data"  # <--- 将默认数据集合的名称从items修改成data

这篇关于【Django-ninja】分页管理器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/671742

相关文章

MyBatis分页查询实战案例完整流程

《MyBatis分页查询实战案例完整流程》MyBatis是一个强大的Java持久层框架,支持自定义SQL和高级映射,本案例以员工工资信息管理为例,详细讲解如何在IDEA中使用MyBatis结合Page... 目录1. MyBATis框架简介2. 分页查询原理与应用场景2.1 分页查询的基本原理2.1.1 分

Python库 Django 的简介、安装、用法入门教程

《Python库Django的简介、安装、用法入门教程》Django是Python最流行的Web框架之一,它帮助开发者快速、高效地构建功能强大的Web应用程序,接下来我们将从简介、安装到用法详解,... 目录一、Django 简介 二、Django 的安装教程 1. 创建虚拟环境2. 安装Django三、创

Mybatis-Plus 3.5.12 分页拦截器消失的问题及快速解决方法

《Mybatis-Plus3.5.12分页拦截器消失的问题及快速解决方法》作为Java开发者,我们都爱用Mybatis-Plus简化CRUD操作,尤其是它的分页功能,几行代码就能搞定复杂的分页查询... 目录一、问题场景:分页拦截器突然 “失踪”二、问题根源:依赖拆分惹的祸三、解决办法:添加扩展依赖四、分页

Django中的函数视图和类视图以及路由的定义方式

《Django中的函数视图和类视图以及路由的定义方式》Django视图分函数视图和类视图,前者用函数处理请求,后者继承View类定义方法,路由使用path()、re_path()或url(),通过in... 目录函数视图类视图路由总路由函数视图的路由类视图定义路由总结Django允许接收的请求方法http

Django HTTPResponse响应体中返回openpyxl生成的文件过程

《DjangoHTTPResponse响应体中返回openpyxl生成的文件过程》Django返回文件流时需通过Content-Disposition头指定编码后的文件名,使用openpyxl的sa... 目录Django返回文件流时使用指定文件名Django HTTPResponse响应体中返回openp

Django开发时如何避免频繁发送短信验证码(python图文代码)

《Django开发时如何避免频繁发送短信验证码(python图文代码)》Django开发时,为防止频繁发送验证码,后端需用Redis限制请求频率,结合管道技术提升效率,通过生产者消费者模式解耦业务逻辑... 目录避免频繁发送 验证码1. www.chinasem.cn避免频繁发送 验证码逻辑分析2. 避免频繁

Android Paging 分页加载库使用实践

《AndroidPaging分页加载库使用实践》AndroidPaging库是Jetpack组件的一部分,它提供了一套完整的解决方案来处理大型数据集的分页加载,本文将深入探讨Paging库... 目录前言一、Paging 库概述二、Paging 3 核心组件1. PagingSource2. Pager3.

MySQL深分页进行性能优化的常见方法

《MySQL深分页进行性能优化的常见方法》在Web应用中,分页查询是数据库操作中的常见需求,然而,在面对大型数据集时,深分页(deeppagination)却成为了性能优化的一个挑战,在本文中,我们将... 目录引言:深分页,真的只是“翻页慢”那么简单吗?一、背景介绍二、深分页的性能问题三、业务场景分析四、

SQL Server配置管理器无法打开的四种解决方法

《SQLServer配置管理器无法打开的四种解决方法》本文总结了SQLServer配置管理器无法打开的四种解决方法,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录方法一:桌面图标进入方法二:运行窗口进入检查版本号对照表php方法三:查找文件路径方法四:检查 S

Golang如何用gorm实现分页的功能

《Golang如何用gorm实现分页的功能》:本文主要介绍Golang如何用gorm实现分页的功能方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录背景go库下载初始化数据【1】建表【2】插入数据【3】查看数据4、代码示例【1】gorm结构体定义【2】分页结构体