当前位置: 首页 > 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,会返回全部数据。

http://www.lryc.cn/news/447708.html

相关文章:

  • SpringBoot整合JPA实现CRUD详解
  • 干部画像——精准辅助干部选拔的核心利器
  • linux网络编程9
  • RabbitMQ应用
  • 大数据Flink(一百二十四):案例实践——淘宝母婴数据加速查询
  • 无限大薄板的电场
  • 外包干了1个多月,技术明显退步了。。。。。
  • 芝法酱学习笔记(0.4)——SpringBoot多模块项目打包,resource分离,lib分离,启动脚本
  • 进程(一万字学习笔记)
  • Docker实践与应用:深度探索与丰富案例
  • 信息安全工程师(21)安全协议
  • Starrocks with 嵌套
  • ubuntu 安装neo4j
  • 云计算课程作业1
  • 建筑智能,推动智慧社区发展
  • conda 虚拟环境安装GDAL
  • STM32转AT32代码转换
  • vue中怎么覆盖 sytle中的样式
  • php中打印函数
  • [单master节点k8s部署]23.构建EFK日志收集平台(二)
  • C#的属性(Property)应用说明(二)
  • VUE.js笔记
  • SpringBoot--yml配置文件的时间/大小的单位转换
  • 【算法业务】互联网风控业务中的拒绝推断场景算法应用分享(涉及半监督算法、异常检测、变分自编码、样本权重自适应调整、迁移学习等)
  • Windows PowerShell相关笔记
  • 力扣9.24
  • NRF21540—低功耗蓝牙,蓝牙mesh、Thread和Zigbee和2.4 GHz私有协议范围扩展射频前端模块
  • 2024最新Linux Socket编程
  • Linux下的驱动开发二
  • 【JAVA报错已解决】 Java.lang.ArrayIndexOutOfBoundsException