返回顶部

DRF之分页器

一. DRF分页器

  我们数据库有几千万条数据,这些数据需要展示,我们不可能直接从数据库把数据全部读取出来,这样会给内存造成特别大的压力,有可能还会内存溢出,所以我们希望一点一点的取,那展示的时候也是一样的,总是要进行分页显示。

  DRF给我们提供了三种分页方式,我们看下他们都是什么样的。

1.分页组件的使用

DRF提供的三种分页:

from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination, CursorPagination

第一种 PageNumberPagination  看第n页,每页显示n条数据

路由进行了一层分发:

path('pagination/', include('pagination.urls'))

urls:

from django.urls import path
from pagination.views import PageView

urlpatterns = [
    path('test/', PageView.as_view())

]

自己写的分页器类:

from rest_framework.pagination import PageNumberPagination

class MyPagination(PageNumberPagination):

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


views:

from rest_framework.views import APIView

from utiles.pagination import MyPagination
from xuliehua import models
from xuliehua.serializers import BookModelSerializer

# Create your views here.


class PageView(APIView):

    def get(self, request):
        queryset = models.Book.objects.all()
        page_obj = MyPagination()
        page_queryset = page_obj.paginate_queryset(queryset=queryset, request=request, view=self)

        ret = BookModelSerializer(page_queryset,many=True)

        return page_obj.get_paginated_response(ret.data)

特别注意:

1. 通过 page_obj.get_paginated_response(ret.data)的方法返回的数据,会带有吓一跳路径。

{
    "count": 3,
    "next": "http://127.0.0.1:8000/pagination/test/?page=2",
    "previous": null,
    "results": [
        {
            "id": 1,
            "category_display": "Python",
            "publisher_info": {
                "id": 1,
                "title": "北京出版社"
            },
            "authors": [
                {
                    "id": 1,
                    "name": "alex"
                },
                {
                    "id": 2,
                    "name": "wupeiqi"
                }
            ],
            "title": "python全栈开发2",
            "pub_time": "2020-10-14"
        },
        {
            "id": 2,
            "category_display": "Linux",
            "publisher_info": {
                "id": 2,
                "title": "上海出版社"
            },
            "authors": [
                {
                    "id": 1,
                    "name": "alex"
                }
            ],
            "title": "数据库基础",
            "pub_time": "2020-10-01"
        }
    ]
}

 

第二种 LimitOffsetPagination 在第n个位置  向后查看n条数据


from rest_framework.pagination import  LimitOffsetPagination

class
MyLimitOffset(LimitOffsetPagination): default_limit = 1 limit_query_param = 'limit' offset_query_param = 'offset' max_limit = 999

 

 

第三种 CursorPagination 加密游标的分页 把上一页和下一页的id记住


from rest_framework.pagination import CursorPagination

class
MyCursorPagination(CursorPagination): cursor_query_param = 'cursor' page_size = 1 ordering = '-id'

 

posted @ 2020-10-14 22:31  muguangrui  阅读(108)  评论(0编辑  收藏  举报