07,分页

Django在处理分页的方式上有很多,原生的Paginator可以、第三方模块pure-paginator也行。当然了在django rest-framework接口的设计中,django也为我们提供了三种分页的方案。

from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination, CursorPagination 

1、PageNumberPagination

例如:http://127.0.0.1:8000/api/article/?page=2&size=1

这种最为常见,看第N页,每页显示M条数据

首先也是定义分页类

from rest_framework.pagination import PageNumberPagination


class MyPageNumber(PageNumberPagination):
    page_size = 8  # 每页显示多少条
    page_size_query_param = 'size'  # URL中每页显示条数的参数
    page_query_param = 'page'  # URL中页码的参数
    max_page_size = 8  # 最大页码数限制

视图1、对于APIView进行的封装

class ArticleList(APIView):
    def get(self, request, *args, **kwargs):
        res = {"code": 1000}
        article_list = models.Article.objects.all().order_by("id")
        # 分页
        page_obj = MyPageNumber()
        page_article = page_obj.paginate_queryset(queryset=article_list, request=request, view=self)
        ser_obj = ArticleSerializer(page_article, many=True)    # 注意这里的传参已经变了
        res["data"] = ser_obj.data
        return Response(res)

视图2、对于ViewSet进行封装的视图

class PublishesViewSet(viewsets.ModelViewSet):
    queryset = Publish.objects.all()
    serializer_class = PublishModelSerializer
    pagination_class = MyPageNumber    # 就是加上这句代码

也可一加在全局

page_size = 8  # 每页显示多少条
page_size_query_param = 'size'  # URL中每页显示条数的参数
page_query_param = 'page'  # URL中页码的参数
max_page_size = 8  # 最大页码数限制

# 照着上面的写
REST_FRAMEWORK = {
    'PAGE_SIZE': 2
}

2、LimitOffsetPagination


例如:http://127.0.0.1:8000/api/article/?offset=2&limit=2

这种见的不多在第N个位置往后偏移查看第M条数据

分页类

# offset分页
class MyLimitOffset(LimitOffsetPagination):
    default_limit = 8
    limit_query_param = 'limit'
    offset_query_param = 'offset'
    max_limit = 8

视图1、APIview

class ArticleList(APIView):
    def get(self, request, *args, **kwargs):
        res = {"code": 0}
        article_list = models.Article.objects.all().order_by("id")
        # 分页
        page_obj = MyLimitOffset()
        page_article = page_obj.paginate_queryset(queryset=article_list, request=request, view=self)
        ser_obj = ArticleSerializer(page_article, many=True)
        res["data"] = ser_obj.data
        return page_obj.get_paginated_response(res)

视图2、Viewset

class PublishesViewSet(viewsets.ModelViewSet):
    queryset = Publish.objects.all()
    serializer_class = PublishModelSerializer
    pagination_class = MyLimitOffset    # 就是加上这句代码

代码一样

全局配置的参数当然也要改一下

    default_limit = 8
    limit_query_param = 'limit'
    offset_query_param = 'offset'
    max_limit = 8
    
    # 照着上面的写
    REST_FRAMEWORK = {
        'default_limit': 8
        ...
}

分页也就到此结束了!可以同Django原生的分页做个对比。

原文地址:https://www.cnblogs.com/pontoon/p/10217431.html