DRF 分页

DRF 分页

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

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

DRF使用分页

DRF提供分页的三种模式

  1. PageNumberPagination
  2. LimitOffsetPagination
  3. CursorPagination

全局配置

在settings.py文件中配置

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  # 注意不是列表(只能有一个分页模式)

手写的view配置分页

class TestView(APIView):
    """test view"""

    def get(self, request):
        # 查询数据
        queryset = Publisher.objects.all()
        # 生成一个分页器对象
        page_obj = MyPageNumberPagination()
        # 取到当前用户请求的这一页的数据
        page_queryset = page_obj.paginate_queryset(queryset, request, view=self)
        # 序列化当前数据
        ser_obj = PublisherModelSerializer(page_queryset, many=True)
        return page_obj.get_paginated_response(ser_obj.data)

DRF 内置分页

PageNumberPagination

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

tips: 自定义分页时,ORM QuerySet切片之后不能再order_by 。

class MyPageNumberPagination(PageNumberPagination):
    page_size = 1  # 每页显示多少条
    page_query_param = 'page'  # URL中页码的参数
    page_size_query_param = 'size'  # URL中每页显示条数的参数
    max_page_size = None  # 最大页码数限制,只有page_size_query_param在设置情况下才可用


LimitOffsetPagination

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

class MyLimitOffsetPagination(LimitOffsetPagination):
    default_limit = 1  # 与page_size相同,在页面显示多少条,同时也是在SQL查询中limit的数据条数
    limit_query_param = 'limit'  # URL中数据条数"limit"的参数
    offset_query_param = 'offset'  # URL中偏移值"offset"的参数
    max_limit = 999  # 表示客户端可能请求的最大允许限制


CursorPagination

游标型分页,只允许上一页、下一页,不允许指定页码。在数据集极大时,时间稳定,并且不会随着数据集大小的增加而减慢。

class MyCursorPagination(CursorPagination):
    cursor_query_param = 'cursor'  # URL中"cursor"的参数
    page_size = 1  # 每页显示多少条
    ordering = '-id'  # 排序的字段

posted @ 2019-08-16 16:36  写bug的日子  阅读(272)  评论(0编辑  收藏  举报