19、Django_rest framework_分页引擎

2019-12-15  本文已影响0人  猪儿打滚

常见的需求:分页返回查询到的结果

一、pagination分页类

使用rest framework官方的pagination分页引擎,提供了三种分页类:
1.PageNumberPagination:根据页数进行分页
2.LimitOffsetPagination:根据偏移量进行分页
3.CursorPagination:根据游标进行分页

二、PageNumberPagination:根据页数进行分页
1.1 指定全局分页引擎
REST_FRAMEWORK = {    
"DEFAULT_RENDERER_CLASSES": (
        "rest_framework.renderers.JSONRenderer",
        "rest_framework.renderers.BrowsableAPIRenderer",
    ),
    # 设置全局过滤引擎
    'DEFAULT_FILTER_BACKENDS':[
    'rest_framework.filters.OrderingFilter',
    'django_filters.rest_framework.backends.DjangoFilterBackend'
],
    # 设置全局分页引擎
    'DEFAULT_PAGINATION_CLASS':[
    # 设置分页引擎
    'rest_framework.pagination.PageNumberPagination'
    # 指定每页返回的条数
    'PAGE_SIZE': 10
]
}
def get(self, request):
    # 建议调用get_queryset方法来获取查询集
    project_qs = self.get_queryset()
    # 对查询集进行过滤(使用的是上面类属性定义的过滤引擎),并覆盖,获取到的是经过排序后的查询集
    project_qs = self.filter_queryset(project_qs)

    ## 使用paginate_queryset进行分页,返回的是分页后的查询集(如果没有指定分页引擎,那么返回的是None)
    page = self.paginate_queryset(project_qs)
    ## 判断是否指定了分页引擎,指定了则返回分页后的数据,否则返回只经过过滤引擎处理后的数据
    if page is not None:
        serializer = self.get_serializer(instance=project_qs, many=True)
        ## 返回分页后的数据
        return self.get_paginated_response(serializer.data)


    # 建议使用get_serializer方法来获取序列化器
    serializer = self.get_serializer(instance=project_qs, many=True)
    # 响应返回;如果请求没有指定Accept,那么默认返回json
    return Response(serializer.data, status=status.HTTP_200_OK)
# 查询name=测试的第二页数据
http -v http://xxx/porojects/ name==测试 page=2
http -v http://xxx/porojects/?name==测试?page=2
1.2 在视图类中,指定分页引擎
# 1.导包
from rest_framework.pagination import PageNumberPagination
# 2.指定分页引擎
pagination_class = PageNumberPaginationManual
三、自定义分页类
1.1 有这么几个需求

1.想要自定义页数的key,不想为page,比如为currpage
2.想要前端自己想要每页显示多少页,就自己传递值过来,并且key为pagesize

1.2 方法:

写一个新的类,继承PageNumberPagination类,在这个类的基础上进行修改

1.3 步骤:
from rest_framework.pagination import PageNumberPagination
class PageNumberPaginationManual(PageNumberPagination):
   # 当前页数的key从page修改为currpage
    page_query_param = 'currpage'
    # 默认每页显示的条数为2;page_size也是请求时的key
    page_size = 2
    # 把page_size修改为pagesize
    page_size_query_param = 'pagesize'
    # 分页的最大的page_size,每页不能显示超过50条
    max_page_size = 50
REST_FRAMEWORK = {    
"DEFAULT_RENDERER_CLASSES": (
        "rest_framework.renderers.JSONRenderer",
        "rest_framework.renderers.BrowsableAPIRenderer",
    ),
    # 设置全局过滤引擎
    'DEFAULT_FILTER_BACKENDS':[
    'rest_framework.filters.OrderingFilter',
    'django_filters.rest_framework.backends.DjangoFilterBackend'
],
    # 设置全局分页引擎
    'DEFAULT_PAGINATION_CLASS':[
    # 设置自定义的分页引擎
    'utils.PageNumberPaginationManual'
]
}
# 查询name=测试,第二页,每页显示4条(也就是得到第5-8条)
http -v http://xxx/porojects/?name==测试?currpage=2?pagesize=4
上一篇下一篇

猜你喜欢

热点阅读