Django和DRF自定义分页功能
DRF中
1、自定义PageNumberPagination
from rest_framework.pagination import PageNumberPagination
# page_num 页容量,每页显示多少条数据,由前端传给后端的参数
# page 第几页,前端传给后端的参数
class CommonPagination(PageNumberPagination):
page_size = 5 #每页显示记录数,前端没有传入page_num,则默认显示此参数
page_size_query_param = 'page_num' #前端传入每页显示的条数
page_query_param = "page" #前端传入要显示第几页
max_page_size = 10 #后端控制每页显示最大记录数
# 重写分页返回方法,按照指定的字段进行分页数据返回
def get_paginated_response(self, data):
return Response({
'count': self.page.paginator.count, # 总数量
'lists': data, # 用户数据
'page': self.page.number, # 当前页数
'pages': self.page.paginator.num_pages, # 总页数
'pagesize': self.page_size # 后端指定的页容量
'previous': self.get_previous_link(), # 上一页的地址
'next': self.get_next_link(), # 下一页的地址
})
1、如果没有page_size_query_param = 'page_num',则前端显示固定的五条数据,添加此句后根据前端传过来的page_num参数显示数据.
page_query_param = "page"有前端传来的page参数决定显示第几页
- page_size :每页数目;
- page_query_param :前端发送的页数关键字名,默认为”page”;
- page_size_query_param :前端发送的每页数目关键字名,默认为None;
- max_page_size :前端最多能设置的每页数量
2、如果返回数据的参数量和格式不符合需求,则需要自己自定义返回方法def get_paginated_response(self, data)。函数中的data参数的内容是序列化器决定的。
LimitOffsetPagination
前端访问网址形式:
GET http://127.0.0.1/api/students/?limit=100&offset=400
可以在子类中定义的属性:
- default_limit:默认限制,默认值与page_size设置为一致;
- limit_query_param limit:参数名,默认 'limit';
- offset_query_param:offset参数名,默认 'offset';
- max_limit:最大limit限制,默认None
from rest_framework.pagination import LimitOffsetPagination
class StudentViewSet(ModelViewSet):
queryset = StudentsModel.objects.all()
serializer_class = StudentsSerializer
pagination_class = LimitOffsetPagination
2、如果不自定义可以在配置文件中进行配置,从而使用自带的分页功能
在settings配置文件中添加配置
REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
'PAGE_SIZE': 100 # 每页数目
}
Django中
from django.core.paginator import Paginator, EmptyPage
paginator = Paginator(skus, 5)
# 获取每页商品数据
try:
page_skus = paginator.page(page_num)
except EmptyPage:
# 如果page_num不正确,默认给用户400
return JsonResponse({'code': 400,
'errmsg': 'page数据出错'})
# 获取列表页总页数
total_page = paginator.num_pages
或者
from django.core.paginator import Paginator
# 实例化对象(总内容, 每页显示个数)
paginator = Paginator(skus, page_size)
# 求总页数
all_pages = paginator.num_pages
# 根据页码 返回对应的数据
page_skus = paginator.page(page)