Django REST framework分页

不羁的心 提交于 2019-12-04 15:57:04

DRF分页组件

为什么要使用分页

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

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

DRF使用分页器

# 分页
class BookView(APIView):
    # authentication_classes = [TokenAuth,] # [TokenAuth(),]
    # permission_classes = []
    # throttle_classes = []
    # parser_classes = [JSONParser, FormParser]

    def get(self, request):
        print("request.user", request.user)
        print("request.auth", request.auth)
        print("_request.body", request._request.body)
        print("_request.GET", request._request.GET)
        book_list = Book.objects.all()
        # # 分页(原理)
        from rest_framework.pagination import PageNumberPagination
        pnp = PageNumberPagination()
        # 在序列化之前就进行分页
        books_pag = pnp.paginate_queryset(book_list, request,self)
        bs = BookModelSerializers(books_pag, many=True)
        
        return Response(bs.data)

 

分页模式

rest framework中提供了三种分页模式:

DRF使用分页器

分页模式

rest framework中提供了三种分页模式:

from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination, CursorPagination

全局配置

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

DRF内置分页器

PageNumberPagination

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

例如:http://127.0.0.1:8000/api/article/?page=2&size=1

分页器

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

视图

class ArticleList(APIView):
    def get(self, request, *args, **kwargs):
        res = {"code": 0}
        article_list = models.Article.objects.all().order_by("id")
        # 分页
        page_obj = MyPageNumber()
        page_article = page_obj.paginate_queryset(queryset=article_list, request=request, view=self)
        ser_obj = ArticleSerializer(page_article, many=True)
        res["data"] = ser_obj.data
        return Response(res)
# 分页
from rest_framework.pagination import PageNumberPagination

class MyPageNumberPagination(PageNumberPagination):

    page_size = 10  # 每页显示多少条
    max_page_size = 10  # # 最大页码数限制

    page_size_query_param = 'size'  # URL中每页显示条数的参数
    page_query_param = 'page'  # URL中页码的参数


# 分页
class BookView(APIView):
    # authentication_classes = [TokenAuth,] # [TokenAuth(),]
    # permission_classes = []
    # throttle_classes = []
    # parser_classes = [JSONParser, FormParser]
    def get(self, request):

        book_list = Book.objects.all()
        # # 分页(原理)
        page_obj = MyPageNumberPagination()
        # # 在序列化之前就进行分页
        # books_pag = pnp.paginate_queryset(book_list, request,self)
        books_pag = page_obj.paginate_queryset(queryset=book_list, request=request, view=self)
        bs = BookModelSerializers(books_pag, many=True)
        return Response(bs.data)

 

 

 

 

返回带页码链接的响应

class ArticleList(APIView):
    def get(self, request, *args, **kwargs):
        res = {"code": 0}
        article_list = models.Article.objects.all().order_by("id")
        # 分页
        page_obj = MyPageNumber()
        page_article = page_obj.paginate_queryset(queryset=article_list, request=request, view=self)
        ser_obj = ArticleSerializer(page_article, many=True)
        res["data"] = ser_obj.data
        return page_obj.get_paginated_response(res)

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!