django-restframework之分页器组件,接口分页

分页乃是开发必备技能之一
各种花式分页,当然,那是前端的事情了,我们后端开发平凡而朴素
只能没有太多的花里胡哨,把表切一切分一分,把接口与希望交给了前端

接口进行分页其实也挺简单,今天就给大家分享一些吧!
第一个分页器,为了了解流程,我们用APIView来写:

第一步,我们先生成一个分页器:

from rest_framework.pagination import PageNumberPagination


class SelfPaginations(PageNumberPagination):
    page_size = 2
    page_query_param = 'page'
    page_size_query_param = 'size'
    max_page_size = 5

好了,十分完美
page_size = 2 代表每页两条数据
page_query_param = ‘page’ 代表?page= 这个参数的page,你要是改成p,就是?p=
page_size_query_param = ‘size’ 可临时调整每页数量
max_page_size = 5 临时调整最大数量限制
白话你们可能不懂,等会上图,先看视图

class BookView(APIView):
    def get(self,request):
        book = Book.objects.all()  #获取queryset
        paginate = SelfPaginations()  #获取分页对象
        page_obj = paginate.paginate_queryset(book,request)   #进行分页
        serialized_data = BookSerialize(page_obj,many=True)   #进行序列化
        return Response(serialized_data.data)   #返回数据

完美,接下来请求
django-restframework之分页器组件,接口分页_第1张图片
我们代码给的每页是两条数据
临时调整这页为3条数据

django-restframework之分页器组件,接口分页_第2张图片
第二页数据

django-restframework之分页器组件,接口分页_第3张图片
第一页数据要求为6条
但是可以看出,只返回了5条,因为我们设置了max_page_size =5

嗯嗯,不错不错
其实page_query_param='page’我们不设置也行,源码本就是这个参数

APIView的分页就这样
我们来看看ModelViewset怎么进行分页的把

在源码中

@property
    def paginator(self):
        """
        The paginator instance associated with the view, or `None`.
        """
        if not hasattr(self, '_paginator'):
            if self.pagination_class is None:  这里如果未None,则默认无分页
                self._paginator = None
            else:
                self._paginator = self.pagination_class()
        return self._paginator

    def paginate_queryset(self, queryset):
        """
        Return a single page of results, or `None` if pagination is disabled.
        """
        if self.paginator is None:
            return None
        return self.paginator .paginate_queryset(queryset, self.request, view=self)  #这段指向属性方法

可以看出 ModelViewset中应该指定pagination_class 了
与其他认证、频率、权限、响应等配置不同,他们在源码中时循环取对象
所以加一个 [ ] 在配置时
分页这明显没有
所以直接:

class BookView(viewsets.ModelViewSet):
    # authentication_classes = [UserAuth]
    # permission_classes = [UserPerm]
    # throttle_classes = [RateThrottle]
    pagination_class = SelfPaginations
    renderer_classes = [JSONRenderer]
    queryset = Book.objects.all()
    serializer_class = BookSerialize

返回对象就行了

最终的测试结果依旧是能正常运行,这里就不贴图了

我还是贴张图把,这个分页配置通过了ListMixinModel的加持
所以返回的数据要丰富多了
django-restframework之分页器组件,接口分页_第4张图片
又简单又丰富,ModelViewset简直完美

其实这个也有全局配置
把我们那些视图中的局部配置都注释掉,直接在settings.py中写

REST_FRAMEWORK = {
     'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
     'PAGE_SIZE':2,
}

就分页成功了,当然,你可以将SelfPaginations替换PageNumberPagination,
用我们自定义的分页器对象,SelfPaginations也是继承PageNumberPagination的

但是全部配置导致每一个接口都被分页了,所以不建议使用

分页这块就说到这里了,吼吼吼吼吼

你可能感兴趣的:(rest,framework,接口,分页器,django,restful)