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参数决定显示第几页

  1. page_size :每页数目;
  2. page_query_param :前端发送的页数关键字名,默认为”page”;
  3. page_size_query_param :前端发送的每页数目关键字名,默认为None;
  4. max_page_size :前端最多能设置的每页数量

2、如果返回数据的参数量和格式不符合需求,则需要自己自定义返回方法def get_paginated_response(self, data)。函数中的data参数的内容是序列化器决定的。

LimitOffsetPagination

前端访问网址形式:

GET http://127.0.0.1/api/students/?limit=100&offset=400

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

  1. default_limit:默认限制,默认值与page_size设置为一致;
  2. limit_query_param limit:参数名,默认 'limit';
  3. offset_query_param:offset参数名,默认 'offset';
  4. 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)
posted @ 2021-06-21 22:42  kopok  阅读(411)  评论(0编辑  收藏  举报