Django restframework分页器组件增加的基本使用

为了更好的显示响应的书数据,先基本介绍渲染器的使用:现在settings.py的文件种变量INSTALL_APPS中添加一个app——“rest_framework”,在请求视图类中返回数据响应的方式使用from rest_framework.response import Response的类,请求视图类中可不再使用json.dumps()数据,直接返回响应Response(ser.data),在讲解分页器的知识会运用到视图类中。

在Django restframework中,框架提供了三种分页的方式,以下分点介绍三种分页方式。

1、看第n页,每页显示m条数据:一般页码的请求地址类似于http://localhost:8000/roles/?page=2&size=8

①一般我们可以自定义一个专门为响应的数据提供的分页序列化器,这里以响应角色数据为例

from rest_framework import serializer
class PagerSerializer(serializer.ModelSerializer):
    class Meta:
        model = Role
        fields = "__all__"

②如果不使用分页器,响应数据的方式就会将所有的数据显示在前端中

from rest_framework.response import Response

class RoleView(APIView):
    def get(self, *args, **kwargs):
        roles = Role.object.all()
        ser = PagerSerializer(instance=roles, many=True)
        return Response(ser.data)

③使用分页器需要先导入相关的分页器类:from rest_framework.pagination import PageNumberPagination,在查看其中源码时,有一些有关于分页的配置可以在settings.py文件中配置,如果没有配置,就会使用这个类相关的默认值。当然我们可以继承这个类来自定义分页器类,自定义的类只需要修改分页相关的属性值就可以。分页器类的功能是将得到的所有数据先分号页,然后再将分好页的数据放置在序列化中

from rest_framework.pagination import PageNumberPagination

class MyPagination(PageNumberPagination):
    # 页面显示的数据条数
    page_size = 2
    # 页码请求地址上的url的get参数名称
    page_query_param = "size"
    # 页面允许显示的最多数据条数
    max_page_size = 8

④请求的视图类中,返回响应数据的方式发生变化,分页器对象还提供一些方法,让响应的数据更丰富一点:增加上、下页的url地址和查询的总记录数。

from rest_framework.response import Response

class RoleView(APIView):
    def get(self, request, *args, **kwargs):
        roles = Role.object.all()
        # 将得到的所有数据分好页
        pg = MyPagination()
        role_pages = pg.paginate_queryset(queryset=roles, request=request, view=self)
        # 将分好页的数据放置分页序列化器中即可
        ser = PagerSerializer(instance=role_oages, many=True)
        # 这种只会返回数据
        # return Response(ser.data)
        # 这种就会额外显示上下页url地址和总记录数
        return pg.get_paginated_response(ser.data)

 2、在n个位置后,查看m条数据,一般页码的请求地址类似于http://localhost:8000/roles/?offset=2&limit=8。视图和序列化类都可以不用变,自定义分页类需要继承另外一个类,from rest_framework.pagination import LimitOffsetPagination。当然我们可以继承这个类来自定义分页器类,自定义的类只需要修改分页相关的属性值就可以。分页器类的功能是将得到的所有数据先分号页,然后再将分好页的数据放置在序列化中

from rest_framework.pagination import LimitOffsetPagination

class MyPagination(LimitOffsetPagination):
    # 页面显示的数据条数
    default_limit = 2
    # 页码请求地址上的url的get参数名称
    limit_query_param = "limit"
    offset_query_param = "offset"
    # 页面允许显示的最多数据条数
    max_limit = 8

 3、加密分页,只显示上一页和下一页,一般页码的请求地址类似于http://localhost:8000/roles/?page=fnew39。序列化类都可以不用变,自定义分页类需要继承另外一个类,from rest_framework.pagination import CursorPagination。当然我们可以继承这个类来自定义分页器类,自定义的类只需要修改分页相关的属性值就可以。分页器类的功能是将得到的所有数据先分号页,然后再将分好页的数据放置在序列化中。由于上一页和下一页地址已加密,所以在请求试图类中就只能使用分页对象返回响应的数据:return pg.get_paginated_response()

from rest_framework.pagination import CursorPagination

class MyPagination(CursorPagination):
    # 页面显示的数据条数
    page_size = 2
    # 页码请求地址上/下一页的url的get参数名称
    cursor_query_param = "cursor"
    # 页面展示数据数url的get参数名称
    page_size_query_param = "size"
    # 查询的数据的排序方式
    ordering = "-id"
    # 页面允许显示的最多数据条数
    max_page_size = 8

 

posted @ 2020-06-12 23:10  xsha_h  阅读(330)  评论(0编辑  收藏  举报