Django之rest_framework的Pagination

官方文档:https://www.django-rest-framework.org/api-guide/pagination/#setup

Django提供了一些类来帮助您管理分页数据 - 即分布在多个页面上的数据,带有“上一页/下一页”链接。

REST框架包括对可自定义分页样式的支持。这允许您修改将大型结果集拆分为单个数据页的方式。
分页API可以支持:

1.分页链接是作为响应内容的一部分提供的。
2.响应标头中包含的分页链接,例如Content-Range或Link。
内置样式目前都使用包含在响应内容中的链接。使用可浏览API时,此样式更易于访问。

只有在使用通用视图或视图集时( generic views or viewsets),才会自动执行分页。如果您使用常规APIView,则需要自己调用分页API以确保返回分页响应。有关示例,请参阅mixins.ListModelMixin和generics.GenericAPIView类的源代码。

可以通过将分页类设置为“None”来关闭分页。

设置分页样式

可以使用DEFAULT_PAGINATION_CLASS和PAGE_SIZE设置键全局设置分页样式。例如,要使用内置限制/偏移分页,您可以执行以下操作:

REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination',
    'PAGE_SIZE': 100
}

请注意,您需要同时设置分页类和应使用的页面大小。 DEFAULT_PAGINATION_CLASS和PAGE_SIZE都默认为None。
您还可以使用pagination_class属性在单个视图上设置分页类。通常,您希望在整个API中使用相同的分页样式,尽管您可能希望基于每个视图改变分页的各个方面,例如默认或最大页面大小

修改分页样式

如果要修改分页样式的特定方面,则需要覆盖其中一个分页类,并设置要更改的属性。

class LargeResultsSetPagination(PageNumberPagination):
    page_size = 1000
    page_size_query_param = 'page_size'
    max_page_size = 10000

class StandardResultsSetPagination(PageNumberPagination):
    page_size = 100
    page_size_query_param = 'page_size'
    max_page_size = 1000

然后,您可以使用.pagination_class属性将新样式应用于视图:

class BillingRecordsView(generics.ListAPIView):
    queryset = Billing.objects.all()
    serializer_class = BillingRecordsSerializer
    pagination_class = LargeResultsSetPagination

或者使用DEFAULT_PAGINATION_CLASS设置键全局应用样式。例如:

REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS': 'apps.core.pagination.StandardResultsSetPagination'
}

API Reference (三类)

1. PageNumberPagination

此分页样式在请求查询参数中接受单个数字页码。
Request:

GET https://api.example.org/accounts/?page=4

Response:

HTTP 200 OK
{
    "count": 1023
    "next": "https://api.example.org/accounts/?page=5",
    "previous": "https://api.example.org/accounts/?page=3",
    "results": []
}

要全局启用PageNumberPagination样式,请使用以下配置,并根据需要设置PAGE_SIZE:

REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
    'PAGE_SIZE': 100
}
现在有两个需求:
  1. 前端控制当前每页多少条数据
  2. 前端需要自定义的页面数据返回的格式
    那么就需要这样做:
class ModelViewSetPafination(PageNumberPagination):
    # 默认的自定义页数大小
    page_size = 1
    # 获取到前端的自定义页数大小
    page_size_query_param = 'page_size'
    # 一页最大容纳数量
    max_page_size = 1000

    def get_paginated_response(self, data):
        return Response({
            'links': {
                'next': self.get_next_link(),
                'previous': self.get_previous_link()
            },
            'page_number': self.page.number,
            'count': self.page.paginator.count,
            'results': data
        })

前端请求的url:

 http://127.0.0.1:8000/users/user/user_list/?page=2&page_size=2

得到如下结果

{
    "links": {
        "next": "http://127.0.0.1:8000/users/user/user_list/?page=3&page_size=2",
        "previous": "http://127.0.0.1:8000/users/user/user_list/?page_size=2"
    },
    "page_number": 2,
    "count": 12838,
    "results": [
        {
            "id": 3499,
            "user_id": "30bd4b565c2811ea89d200163e0602bc",
            "sex": 2,
            "age": 30,
        },
        {
            "id": 3500,
            "user_id": "493dc3265d0f11ea89d200163e0602bc",
            "sex": 2,
            "age": 30,

        }
    ]
}

2.Configuration

在GenericAPIView子类上,您还可以设置pagination_class属性以基于每个视图选择PageNumberPagination。
PageNumberPagination类包含许多可以重写以修改分页样式的属性。

要设置这些属性,您应该覆盖PageNumberPagination类,然后启用上面的自定义分页类。

1.django_paginator_class - 要使用的Django Paginator类。默认是django.core.paginator.Paginator,对于大多数用例应该没问题。
2.page_size - 表示页面大小的数值。如果设置,则会覆盖PAGE_SIZE设置。默认为与PAGE_SIZE设置键相同的值。
3.page_query_param - 一个字符串值,指示用于分页控件的查询参数的名称。
4.page_size_query_param - 如果设置,则这是一个字符串值,指示允许客户端基于每个请求设置页面大小的查询参数的名称。默认为None,表示客户端可能无法控制请求的页面大小。
5.max_page_size - 如果设置,则这是一个数值,指示允许的最大请求页面大小。仅当还设置了page_size_query_param时,此属性才有效。
6.last_page_strings - 字符串值的列表或元组,指示可与page_query_param一起使用以请求集合中的最终页面的值。默认为(‘last’,)
7.template - 在可浏览API中呈现分页控件时要使用的模板的名称。可以重写以修改呈现样式,或者设置为None以完全禁用HTML分页控件。默认为“rest_framework / pagination / numbers.html”。

3.LimitOffsetPagination

这种分页样式反映了查找多个数据库记录时使用的语法。 客户端包括“limit”和“offset”查询参数。 限制表示要返回的最大项目数,相当于其他样式中的page_size。 偏移量(offset)表示查询相对于整套未标记项目的起始位置。
Request:

GET https://api.example.org/accounts/?limit=100&offset=400

Response:

HTTP 200 OK
{
    "count": 1023
    "next": "https://api.example.org/accounts/?limit=100&offset=500",
    "previous": "https://api.example.org/accounts/?limit=100&offset=300",
    "results": []
}

要全局启用LimitOffsetPagination样式,请使用以下配置:

REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination'
}

或者,您也可以设置PAGE_SIZE键。 如果还使用了PAGE_SIZE参数,则limit查询参数将是可选的,并且客户端可以省略。

在GenericAPIView子类上,您还可以设置pagination_class属性以基于每个视图选择LimitOffsetPagination。

更多详细信息查看官网

链接:https://www.jianshu.com/p/888cb5afaca9

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值