drf之分页
注意
只有在使用通用视图或视图集时,才会自动执行分页。如果您使用常规 APIView,则需要自己调用分页 API 以确保返回分页响应。有关示例,请参阅 mixins.ListModelMixin 和 generics.GenericAPIView 类的源代码。
设置分页样式
#在django全局配置文件中设置
REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination',
'PAGE_SIZE': 100
}
'''
需要同时设置分页类和应使用的页面大小。默认情况下,DEFAULT_PAGINATION_CLASS 和 PAGE_SIZE 都是 None。
您还可以通过使用 pagination_class 属性在单个视图上设置分页类。通常,您希望在整个 API 中使用相同的分页样式,尽管您可能希望在每个视图的基础上更改分页的各个方面,例如默认或最大页大小。
'''
修改分页样式
class StandardResultsSetPagination(PageNumberPagination):
page_size = 100 # 每页显示的数量
page_query_param = 'page' # 接口中选页码的字段名 - 一般不做修改 - ?page=1
page_size_query_param = 'page_size' # 用户可以通过接口自定义一页条数 - ?...&page_size=一页的条数
max_page_size = 1000 # 用户可以自定义的最大一页条数,超过就采用最大值
# 使用 .pagination_class 属性将新样式应用到视图:
class BillingRecordsView(generics.ListAPIView):
pagination_class = StandardResultsSetPagination # 局部设置分页类
三大分页类
from rest_framework.pagination import PageNumberPagination,LimitOffsetPagination,CursorPagination
PageNumberPagination # 常用分页,查出所有,取部分
LimitOffsetPagination # 偏移分页,只能向前或者向后基于当前位置查
CursorPagination # 游标分页,一次只能上一页下一页,但效率极高
PageNumberPagination 类包含许多可以重写以修改分页样式的属性。
要设置这些属性,您应该重写 PageNumberPagination 类,然后启用上面的自定义分页类。
django_paginator_class - 要使用的 Django Paginator 类。默认是 django.core.paginator.Paginator,对于大多数用例应该没问题。
page_size - 表示页面大小的数值。如果设置,则会覆盖 PAGE_SIZE 设置。默认值与 PAGE_SIZE 设置键相同。
page_query_param - 指示要用于分页控件的查询参数的名称的字符串值。
page_size_query_param - 如果设置,则这是指示允许客户端基于每个请求设置页面大小的查询参数的名称的字符串值。默认为 None,表示客户端可能无法控制所请求的页面大小。
max_page_size - 如果设置,则这是指示允许的最大请求页面大小的数值。该属性仅在 page_size_query_param 也被设置时有效。
last_page_strings - 字符串值得列表或元组,指示可与 page_query_param 一起使用的值,用以请求集合中的最终页面。默认为 ('last',)
template - 在可浏览 API 中渲染分页控件时使用的模板的名称。可能会被覆盖以修改渲染样式,或设置为 None 以完全禁用 HTML 分页控件。默认为 "rest_framework/pagination/numbers.html"。
LimitOffsetPagination 类包含许多可以重写以修改分页样式的属性。
要设置这些属性,您应该重写 LimitOffsetPagination 类,然后启用上面的自定义分页类。
default_limit - 如果客户端在查询参数中未提供一个值,则指示使用限制的数值。默认与 PAGE_SIZE 设置键相同的值。
limit_query_param - 指示 “limit” 查询参数的名称的字符串值。默认为 'limit'。
offset_query_param - 指示 “offset” 查询参数的名称的字符串值。默认为 'offset'。
max_limit - 如果设置,则这是指示客户端可能请求的最大允许限度的数值。默认为 None。
template - 在可浏览 API 中渲染分页控件时使用的模板的名称。可能会被覆盖以修改渲染样式,或设置为 None 以完全禁用 HTML 分页控件。默认为 "rest_framework/pagination/numbers.html"。
CursorPagination 类包含许多可以重写以修改分页样式的属性。
要设置这些属性,您应该重写 CursorPagination 类,然后启用上面的自定义分页类。
page_size = 指示页面大小的数值。如果设置,则会覆盖 PAGE_SIZE 设置。默认与 PAGE_SIZE 设置键相同的值。
cursor_query_param = 指示 “cursor” 查询参数的名称的字符串值。默认为 'cursor'。
ordering = 这应该是一个字符串或字符串列表,指示将应用基于游标的分页的字段。例如: ordering = 'slug'。默认为 -created。该值还可以通过在视图上使用 OrderingFilter 来覆盖。
template = 在可浏览 API 中渲染分页控件时使用的模板的名称。可能会被覆盖以修改渲染样式,或设置为 None 以完全禁用 HTML 分页控件。默认为 "rest_framework/pagination/previous_and_next.html"。
自定义分页样式
自定义分页样式 (Custom pagination styles)
要创建自定义分页序列化类,您应该子类化 pagination.BasePagination 并重写 paginate_queryset(self, queryset, request, view=None) 和 get_paginated_response(self, data) 方法:
paginate_queryset 方法传递初始查询集,并且应返回一个只包含请求页面中的数据的可迭代对象。
get_paginated_response 方法传递序列化的页面数据,并返回 Response 实例。
请注意,paginate_queryset 方法可以在分页实例上设置状态,而后 get_paginated_response 方法可以使用它。
重写分页示例
# from rest_framework.pagination import PageNumberPagination
# from rest_framework.pagination import LimitOffsetPagination
# from rest_framework.pagination import CursorPagination
from rest_framework import pagination
class PageNumberPagination(pagination.PageNumberPagination):
# 一页的条数
page_size = 2
# 接口中选页码的字段名 - 一般不做修改 - ?page=1
page_query_param = 'page'
# 用户可以通过接口自定义一页条数 - ?page=1&page_size=一页的条数
page_size_query_param = 'page_size'
# 用户可以自定义的最大一页条数,超过就采用最大值
max_page_size = 4
# 接口:?offset=0&limit=3 从(从头偏移0条)第1条往后查3条
class LimitOffsetPagination(pagination.LimitOffsetPagination):
# 一页的条数
default_limit = 2
limit_query_param = 'limit'
offset_query_param = 'offset'
# 用户可以自定义的最大一页条数,超过就采用最大值
max_limit = 4
class CursorPagination(pagination.CursorPagination):
# 一页的条数
page_size = 2
# 请求页码数据的字段 - 字段后的参数是加密的
cursor_query_param = 'cursor'
# 用户自定义一页条数的字段与最大值
page_size_query_param = 'page_size'
max_page_size = 4
# 默认数据查询的排序条件 - 不能与drf的ordering组件同时使用
ordering = '-id'
详细参考:https://blog.csdn.net/Fweiren/article/details/85226359