ireport 分页配置每也显示多少条_Django-drf-内置分页器的使用

2b8206c96b350d0d91def0dc0b608192.png

Ⅰ REST framework提供了分页的支持

我们可以在配置文件中设置全局的分页方式,如:

REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS':  'rest_framework.pagination.PageNumberPagination',
    'PAGE_SIZE': 100  # 每页数目
}

也可通过自定义Pagination类,来为视图添加不同分页行为。在视图中通过pagination_clas属性来指明

class LargeResultsSetPagination(PageNumberPagination):
    page_size = 1000
    page_size_query_param = 'page_size'
    max_page_size = 10000
class BookDetailView(RetrieveAPIView):
    queryset = BookInfo.objects.all()
    serializer_class = BookInfoSerializer
    pagination_class = LargeResultsSetPagination

注意:如果在视图内关闭分页功能,只需在视图内设置

pagination_class = None

Ⅱ 可选分页器 -- PageNumberPagination:普通分页

前端访问网址形式:

GET  http://127.0.0.1:8000/student/?page=4

可以在子类中定义的属性:

  • page_size -- 每页数目
  • page_query_param -- 前端发送的页数关键字名,默认为”page”
  • page_size_query_param -- 前端发送的每页数目关键字名,默认为None
  • max_page_size -- 前端最多能设置的每页数量

views.py视图函数

from rest_framework.pagination import PageNumberPagination

# 自定义分页器
class MyPageNumberPagination(PageNumberPagination):
    page_size = 3  # 每页显示3条数据
    page_query_param = 'page'  # 查询参数
    page_size_query_description = 'size'
    max_page_size = 5  # 最大每页显示五条数据

# 查询函数
from app01.serializer import StudentSerializer
from app01.models import Student
from rest_framework.viewsets import GenericViewSet
from rest_framework.mixins import ListModelMixin

class StudentView(GenericViewSet, ListModelMixin):  # 使用自动生成路由,必须继承ViewSetMixin
    queryset = Student.objects.all()
    serializer_class = StudentSerializer

    pagination_class = MyPageNumberPagination  # 配置自定义的分页器

serializer.py序列化器

from app01.models import Student
from rest_framework import serializers

class StudentSerializer(serializers.ModelSerializer):
    sex = serializers.CharField(source='get_sex_display')
    class Meta:
        model = Student
        fields = '__all__'

models.py表模型

from django.db import models

class Student(models.Model):
    choice_sex = [(1, '男'), (2, '女'), (0, '保密')]
    name = models.CharField(max_length=32)
    sex = models.SmallIntegerField(choices=choice_sex,default=0)
    age = models.IntegerField()

urls.py自动生成路由

from django.contrib import admin
from django.urls import path

from app01 import views
from rest_framework.routers import SimpleRouter
router = SimpleRouter()   # 选择生成不带id的路由
router.register('student',views.StudentView)

urlpatterns = [
    path('admin/', admin.site.urls),
]

urlpatterns += router.urls

05dab049e47d5fc72b02c08ace14305a.png

Ⅲ 可选分页器 -- LimitOffsetPagination:偏移分页

前端访问网址形式:

GET http://127.0.0.1/four/student/?limit=100&offset=400
  • default_limit = api_settings.PAGE_SIZE # 默认条数
  • limit_query_param = 'limit' # 查询时,查询参数及指定查询多少条
  • offset_query_param = 'offset' # 查询时,指定的起始位置是哪
  • max_limit = None # 查询时,最多返回多少条

views.py偏移分页器视图类

# 分页器视图  -- 偏移分页
from rest_framework.pagination import LimitOffsetPagination

class MyPageNumberPagination(LimitOffsetPagination):
    default_limit = 5
    limit_query_param = 'limit'
    offset_query_param = 'offset'
    max_limit = 5

4d431f7fdfeafa1a24d6fb489d6d7b22.png

Ⅳ 可选分页器 -- CursorPagination:游标分页 -- 速度快,但不能指定查询

前端访问网址形式:

GET http://127.0.0.1/four/student/                 # 首页,第一页
GET http://127.0.0.1/four/student/?cursor=cD03     # 点击上一页  or  上一页自动生成的
  • cursor_query_param = 'cursor' # 查询的时候,指定的查询方式
  • page_size = api_settings.PAGE_SIZE # 每页显示多少条
  • ordering = '-created' # 排序方式
  • page_size_query_param = None # 查询的时候指定每页显示多少条
  • max_page_size = None # 每页最多显示多少条

views.py游标分页视图类

from rest_framework.pagination import CursorPagination

class MyPageNumberPagination(CursorPagination):
    cursor_query_param = 'cursor'               # 查询方式
    page_size = 3                               # 每页显示多少条
    ordering = '-id'                            # 排序方式,按什么排序
    page_size_query_description = None          # 查询的时候指定每页显示多少条
    max_page_size = None                        # 每页最多显示多少

81a9f6f85b5f919295eba5d468c0bdd3.png

Ⅴ 继承APIView的分页方式

views.py分页器类

from rest_framework.pagination import PageNumberPagination

class MyPageNumberPagination(PageNumberPagination):
    page_size = 3  # 每页显示3条数据
    page_query_param = 'page'  # 查询参数
    page_size_query_description = 'size'
    max_page_size = 5  # 最大每页显示五条数据

class StudentAPIView(APIView):
    def get(self, request):
        student_list = Student.objects.all()
        page = MyPageNumberPagination()  # 普通分页器实例化得到对象
        res = page.paginate_queryset(student_list, request, self)  # 分页后的数据,分页器指定几条,就有几条
        ser = StudentSerializer(res, many=True)
        # return Response(ser.data)  # 返回当前分页的一页的数据
        return page.get_paginated_response(ser.data)  # 返回全部序列化数据

f5b399f3bbed58659a57f257dcee1201.png

后续变更分页器类即可使用三种不同分页器

page = MyPageNumberPagination()  # 普通分页器偏移分页器游标分页器实例化得到对象
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值