rest-framework-分页器

本文详细介绍了Django REST framework中的三种分页器:简单分页、偏移分页和Cursor分页。包括如何自定义分页参数,以及在设置中配置每页显示数量的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一 简单分页(查看第n页,每页显示n条)

复制代码
from rest_framework.pagination import PageNumberPagination
# 一 基本使用:url=url=http://127.0.0.1:8000/pager/?page=2&size=3,size无效
class  Pager(APIView):
    def get(self,request,*args,**kwargs):
        # 获取所有数据
        ret=models.Book.objects.all()
        # 创建分页对象
        page=PageNumberPagination()
        # 在数据库中获取分页的数据
        page_list=page.paginate_queryset(ret,request,view=self)
        # 对分页进行序列化
        ser=BookSerializer1(instance=page_list,many=True)
        return Response(ser.data)
# 二 自定制 url=http://127.0.0.1:8000/pager/?page=2&size=3
# size=30,无效,最多5条
class Mypage(PageNumberPagination):
    page_size = 2
    page_query_param = 'page'
    # 定制传参
    page_size_query_param = 'size'
    # 最大一页的数据
    max_page_size = 5
class  Pager(APIView):
    def get(self,request,*args,**kwargs):
        # 获取所有数据
        ret=models.Book.objects.all()
        # 创建分页对象
        page=Mypage()
        # 在数据库中获取分页的数据
        page_list=page.paginate_queryset(ret,request,view=self)
        # 对分页进行序列化
        ser=BookSerializer1(instance=page_list,many=True)
        # return Response(ser.data)
        # 这个也是返回Response对象,但是比基本的多了上一页,下一页,和总数据条数(了解即可)
        return page.get_paginated_response(ser.data)

复制代码

setting里

REST_FRAMEWORK = {
    # 每页显示两条
    'PAGE_SIZE':2
}

 路由:

url(r'^pager/$', views.Pager.as_view()),

 Serializers

class BookSerializer1(serializers.ModelSerializer):
    class Meta:
        model=models.Book
        # fields="__all__"
        exclude=('authors',)

 

 

二 偏移分页(在第n个位置,向后查看n条数据)

复制代码
# http://127.0.0.1:8000/pager/?offset=4&limit=3
from rest_framework.pagination import LimitOffsetPagination
# 也可以自定制,同简单分页
class  Pager(APIView):
    def get(self,request,*args,**kwargs):
        # 获取所有数据
        ret=models.Book.objects.all()
        # 创建分页对象
        page=LimitOffsetPagination()
        # 在数据库中获取分页的数据
        page_list=page.paginate_queryset(ret,request,view=self)
        # 对分页进行序列化
        ser=BookSerializer1(instance=page_list,many=True)
        # return page.get_paginated_response(ser.data)
        return Response(ser.data)
复制代码

三 CursorPagination(加密分页,只能看上一页和下一页,速度快)

思考:不重写类,修改类属性?

复制代码
from rest_framework.pagination import CursorPagination
# 看源码,是通过sql查询,大于id和小于id
class  Pager(APIView):
    def get(self,request,*args,**kwargs):
        # 获取所有数据
        ret=models.Book.objects.all()
        # 创建分页对象
        page=CursorPagination()
        page.ordering='nid'
        # 在数据库中获取分页的数据
        page_list=page.paginate_queryset(ret,request,view=self)
        # 对分页进行序列化
        ser=BookSerializer1(instance=page_list,many=True)
        # 可以避免页码被猜到
        return page.get_paginated_response(ser.data)
复制代码
posted on 2019-01-05 21:58 漫天飞雪世情难却 阅读( ...) 评论( ...)   编辑 收藏

转载于:https://www.cnblogs.com/jokezl/articles/10226466.html

### 如何在 Django REST framework 中使用分页 为了实现在 Django REST framework (DRF) 中的分页功能,可以按照如下方法进行设置: #### 配置全局分页选项 可以在项目的 `settings.py` 文件中指定默认的分页类以及每页显示的最大项数。这使得在整个应用程序范围内统一处理分页逻辑变得简单。 ```python # settings.py REST_FRAMEWORK = { 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination', 'PAGE_SIZE': 10, } ``` 上述配置选择了 `LimitOffsetPagination` 类作为默认分页机制,并设定了页面大小为 10 条记录[^3]。 对于更灵活的需求,还可以考虑其他类型的内置分页器如 `PageNumberPagination` 或者创建自定义分页器来满足特定场景下的要求[^5]。 #### 使用标准视图中的分页支持 当采用 DRF 提供的标准视图(例如基于类的通用视图或视图集)时,默认情况下会自动应用所设定好的分页行为;然而如果是通过普通的 APIView 实现,则需手动调用分页 API 才能获得相同效果。 下面是一个简单的例子展示了如何在一个列表视图里启用分页特性: ```python from rest_framework import generics from myapp.models import MyModel from myapp.serializers import MyModelSerializer class MyModelListView(generics.ListAPIView): queryset = MyModel.objects.all() serializer_class = MyModelSerializer ``` 在这个案例中,由于继承了 `generics.ListAPIView` ,因此无需额外编码即可享受已配置好分页带来的便利。 如果想要进一步定制化分页的表现形式,比如改变链接结构或是调整响应体的内容布局等,可以通过重写现有的分页器或者新建子类来自定义所需的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值