当前位置: 首页 > news >正文

django drf 分页器

自定义分页器代码:

from django.core.paginator import InvalidPage
from django.core.paginator import Paginator as DjangoPaginator
from django.utils.functional import cached_property
from rest_framework.exceptions import NotFound
from rest_framework.pagination import (PageNumberPagination,_get_displayed_page_numbers,_get_page_links,_positive_int,
)
from rest_framework.response import Response
from rest_framework.utils.urls import remove_query_param, replace_query_paramclass DataPaginator(DjangoPaginator):def validate_number(self, number):"""覆盖默认方法,去掉最大无效page校验:param number::return:"""try:if isinstance(number, float) and not number.is_integer():raise ValueErrornumber = int(number)except (TypeError, ValueError):return super(DataPaginator, self).validate_number(number)if number < 1:return super(DataPaginator, self).validate_number(number)return numberdef page(self, number):if getattr(self, "_page_enabled", True):return super(DataPaginator, self).page(number)else:# 返回所有的数据return self._get_page(self.object_list[:], number, self)class DataPageNumberPagination(PageNumberPagination):page_size = 10page_query_param = "page"page_size_query_param = "page_size"max_page_size = 1000django_paginator_class = DataPaginatordef get_paginated_response(self, data):return Response({"count": self.page.paginator.count, "results": data})def get_html_context(self):"""去除默认最大页限制:return:"""base_url = self.request.build_absolute_uri()def page_number_to_url(page_number):if page_number == 1:return remove_query_param(base_url, self.page_query_param)else:return replace_query_param(base_url, self.page_query_param, page_number)current = self.page.numberfinal = self.page.paginator.num_pagesif current < final:page_numbers = _get_displayed_page_numbers(current, final)else:page_numbers = _get_displayed_page_numbers(final, final)page_links = _get_page_links(page_numbers, current, page_number_to_url)return {"previous_url": self.get_previous_link(),"next_url": self.get_next_link(),"page_links": page_links,}def paginate_queryset(self, queryset, request, view=None):"""覆盖默认方法,从 self.page_params 中获取参数:param queryset::param request::param view::return:"""self.request = requestpage_size = self.get_page_size(request)if not page_size:return Nonepaginator = self.django_paginator_class(queryset, page_size)# 默认为Truepage_enabled = self.page_params.get("page_enabled", True)if page_enabled == "false":page_enabled = Falsesetattr(paginator, "_page_enabled", page_enabled)page_number = self.page_params.get(self.page_query_param, 1)if page_number in self.last_page_strings:page_number = paginator.num_pagestry:self.page = paginator.page(page_number)except InvalidPage as exc:msg = self.invalid_page_message.format(page_number=page_number, message=str(exc))raise NotFound(msg)if paginator.num_pages > 1 and self.template is not None:# The browsable API should display pagination controls.self.display_page_controls = Truereturn list(self.page)@cached_propertydef page_params(self):"""获取分页的参数:return:"""if self.request.method == "POST":return self.request.datareturn self.request.query_paramsdef get_page_size(self, request):"""覆盖默认方法,从 self.page_params 中获取参数:param request::return:"""if self.page_size_query_param:try:return _positive_int(self.page_params[self.page_size_query_param],strict=True,cutoff=self.max_page_size,)except (KeyError, ValueError):passreturn self.page_size

在drf的视图中使用:

from common.drf.page import DataPageNumberPaginationclass ScanRecordList(mixins.ListModelMixin,generics.GenericAPIView):queryset = models.ScanRecord.objects.all()serializer_class = serializers.ScanRecordSerializerpagination_class = DataPageNumberPagination  # 这里指定分页器def get(self, request, *args, **kwargs):return self.list(request, *args, **kwargs)

前端调用:

page=2&page_enabled=false&page_size=10

Tips:

page_enabled为false,会返回全部数据。

相关文章:

  • MP4 格式:前世今生与技术解析
  • HarmonyOS鸿蒙系统开发应用程序,免费开源DevEco Studio开发工具
  • 高级前端进阶:揭秘 MemFire Cloud 的强大助力
  • python和pyqt-tools安装位置
  • pyside6与协程
  • Python基础知识 (九)os模块、异常、异常的传递性
  • MySql语言操作数据库---MySql引擎,数据表,约束,基本查询,条件查询
  • 光耦知识分享 | 浅析施密特触发器光耦的主要特点
  • golang 反射的介绍和使用
  • 别人都在百度云智大会上吹,我就说点别的……
  • Linux进程:fork函数深度剖析
  • “天翼云息壤杯”高校AI大赛开启:国云的一场“造林”计划
  • 【Vite】如何阻止Vite对较小图片的默认处理
  • k8s pv(PersistentVolume) 状态含义
  • 连锁收银系统的五大功能 选择开源收银系统三要素
  • 【Leetcode】104. 二叉树的最大深度
  • Javascript基础之Array数组API
  • JSONP原理
  • js算法-归并排序(merge_sort)
  • Mysql优化
  • 多线程事务回滚
  • 高程读书笔记 第六章 面向对象程序设计
  • 经典排序算法及其 Java 实现
  • 容器服务kubernetes弹性伸缩高级用法
  • # Redis 入门到精通(八)-- 服务器配置-redis.conf配置与高级数据类型
  • #git 撤消对文件的更改
  • #if等命令的学习
  • #include
  • (day18) leetcode 204.计数质数
  • (SpringBoot)第二章:Spring创建和使用
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (第27天)Oracle 数据泵转换分区表
  • (二)JAVA使用POI操作excel
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第3章 信息系统治理(一)
  • (十七)Flink 容错机制
  • (四)事件系统
  • (转)jQuery 基础
  • (最简单,详细,直接上手)uniapp/vue中英文多语言切换
  • .net 7 上传文件踩坑
  • .NET Core中的时区转换问题
  • .NET MAUI Sqlite程序应用-数据库配置(一)
  • .NET8.0 AOT 经验分享 FreeSql/FreeRedis/FreeScheduler 均已通过测试
  • .Net接口调试与案例
  • .net使用excel的cells对象没有value方法——学习.net的Excel工作表问题
  • .NET性能优化(文摘)
  • @Conditional注解详解
  • [ element-ui:table ] 设置table中某些行数据禁止被选中,通过selectable 定义方法解决
  • [3300万人的聊天室] 作为产品的上游公司该如何?
  • [7] CUDA之常量内存与纹理内存
  • [android] 请求码和结果码的作用
  • [Angular] 笔记 18:Angular Router
  • [BZOJ] 2427: [HAOI2010]软件安装
  • [C++初阶]list的模拟实现
  • [C++核心编程](四):类和对象——封装