前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >django pagination 自定义分页

django pagination 自定义分页

作者头像
Autooooooo
发布2020-11-09 11:28:40
7110
发布2020-11-09 11:28:40
举报
文章被收录于专栏:CoxhuangCoxhuang

pagination

#0 GitHub

代码语言:javascript
复制
https://github.com/Coxhuang/django-Pagination

#1 环境

代码语言:javascript
复制
Python3.6
Django==2.0.7
djangorestframework==3.8.2

#2 需求分析

  • 查看某个列表式,需要分页展示
  • 自定义分页输出的格式
  • 自定义分页的参数

#3 开始

#3.1 新建一个Django项目

#3.2 新建文件 pagination.py(文件名随意)

代码语言:javascript
复制
from rest_framework.pagination  import PageNumberPagination
from rest_framework.response import Response
from collections import OrderedDict


class MyCustomPagination(PageNumberPagination):
   
    page_size = 5 # 每页显示多少个

    page_size_query_param = "size" # 默认每页显示3个,可以通过传入pager1/?page=2&size=4,改变默认每页显示的个数

    max_page_size = 100 # 最大页数不超过100

    page_query_param = "page" # 获取页码数的

    def get_paginated_response(self, data):
        """输出格式"""
        return Response(OrderedDict([
            ('count', self.page.paginator.count), # 整个数据的个数
            ('success', True), # 验证消息
            ('next', self.get_next_link()), # 下一页url
            ('previous', self.get_previous_link()), # 上一页url
            ('results', data) # 当前页的数据
         ]))

#3.3 使用

#3.3.1 没有使用分页

视图

代码语言:javascript
复制
class get_view(mixins.CreateModelMixin,
               mixins.ListModelMixin,
               GenericViewSet):
    pagination_class = None # 没有使用分页(也可以注释掉)

    queryset = models.Student.objects.all()
    serializer_class = get_sreializer

接口数据

代码语言:javascript
复制
[
    {
        "id": 1,
        "name": "cox",
        "age": "12"
    },
    {
        "id": 2,
        "name": "cox",
        "age": "12"
    },
    {
        "id": 3,
        "name": "cox",
        "age": "12"
    },
    {
        "id": 4,
        "name": "cox",
        "age": "12"
    },
    
    ...
    ...
    ...
]
#3.3.2 使用分页

视图

代码语言:javascript
复制
from app.pagination import MyCustomPagination
class get_view(mixins.CreateModelMixin,
               mixins.ListModelMixin,
               GenericViewSet):
    pagination_class = MyCustomPagination # 使用刚刚自定义的分页

    queryset = models.Student.objects.all()
    serializer_class = get_sreializer

接口数据

代码语言:javascript
复制
{
    "count": 11,
    "success": true,
    "next": "http://127.0.0.1:8000/get_data/?page=2",
    "previous": null,
    "results": [
        {
            "id": 1,
            "name": "cox",
            "age": "12"
        },
        {
            "id": 2,
            "name": "cox",
            "age": "12"
        },
        {
            "id": 3,
            "name": "cox",
            "age": "12"
        },
        {
            "id": 4,
            "name": "cox",
            "age": "12"
        },
        {
            "id": 5,
            "name": "cox",
            "age": "12"
        }
    ]
}

#3.4 如果有的接口需要显示与其他接口数量不同的数据,该怎么办

需求:

  • A接口,分页显示 5 条数据
  • B接口,每页显示 5 条数据
  • Z接口,每页显示 100000 条数据

如何处理Z接口

尝试:

  • 在Z接口中, 重新定义 page_size = 100000,这样调用分页是,就会覆盖之前的 page_size; (事实证明,这样子不行的)
  • 集成自定义分页类,在子类中重新定义page_size = 100000,在Z接口中 pagination_class = 子类; (完美)

视图

代码语言:javascript
复制
from app.pagination import MyCustomPagination

class MyChildCustomPagination(MyCustomPagination):

    page_size = 1 # 每页显示多少个

class get_view(mixins.CreateModelMixin,
               mixins.ListModelMixin,
               GenericViewSet):
    pagination_class = MyChildCustomPagination # 子类

    queryset = models.Student.objects.all()
    serializer_class = get_sreializer

接口数据

代码语言:javascript
复制
{
    "count": 11,
    "success": true,
    "next": "http://127.0.0.1:8000/get_data/?page=2",
    "previous": null,
    "results": [
        {
            "id": 1,
            "name": "cox",
            "age": "12"
        }
    ]
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-01-31 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • pagination
  • #0 GitHub
  • #1 环境
  • #2 需求分析
  • #3 开始
    • #3.1 新建一个Django项目
      • #3.2 新建文件 pagination.py(文件名随意)
        • #3.3 使用
          • #3.3.1 没有使用分页
          • #3.3.2 使用分页
        • #3.4 如果有的接口需要显示与其他接口数量不同的数据,该怎么办
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档