微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Django REST framework的分页

DRF分页组件

为什么要使用分页

我们数据表中可能会有成千上万条数据,当我们访问某张表的所有数据时,我们不太可能需要一次把所有的数据都展示出来,因为数据量很大,对服务端的内存压力比较大还有就是网络传输过程中耗时也会比较大。

通常我们会希望一部分一部分去请求数据,也就是我们常说的一页一页获取数据并展示出来。

DRF使用分页

分页模式

rest framework中提供了三种分页模式:

from rest_framework.pagination import PageNumberPagination,LimitOffsetPagination,1)">CursorPagination

全局配置

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

局部配置

我们可以在视图类中进行局部设置

class PublisherViewSet(ModelViewSet):
    queryset = models.Publisher.objects.all()
    serializer_class = PublisherModelSerializer
    pagination_class = PageNumberPagination  # 注意不是列表(只能有一个分页模式

DRF内置分页

PageNumberPagination

页码分页,第n页,每页显示m条数据

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

分页

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

视图

 ArticleList(APIView):
    def get(self,request,*args,**kwargs):
        res = {"code": 0}
        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)
 ser_obj.data
        return page_obj.get_paginated_response(res)

LimitOffsetPagination 

分页,在n位置,向后查看m条数据

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

分页

 offset分页
 MyLimitOffset(LimitOffsetPagination):
    default_limit = 1
    limit_query_param = limit
    offset_query_param = offset
    max_limit = 999

视图

 MyLimitOffset()
        page_article = page_obj.paginate_queryset(queryset=article_list,1)">return page_obj.get_paginated_response(res)

CursorPagination

加密分页,把上一页下一页的id值记住

分页

 加密分页
 MyCursorPagination(CursorPagination):
    cursor_query_param = cursor
    page_size = 1
    ordering = -id 重写要排序的字段

视图

 MyCursorPagination()
        page_article = page_obj.paginate_queryset(queryset=article_list,1)"> return Response(res)
        page_obj.get_paginated_response(res)

 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐