分页

准备

# app.models.py :数据层
class Book(models.Model):
    name = models.CharField(max_length=20)
    price = models.DecimalField(max_digits=5, decimal_places=2)
# objectjson.py :序列化
class BookJson(serializers.ModelSerializer):
    class Meta:
        model = models.Book
        fields = '__all__'
        
# urls.py 
urlpatterns = [
    url(r'^books/', views.Books.as_view()),
]
# views.py
class Books(APIView):
    def post(self, request):
        list = []
        for i in range(1, 51):
            list.append(models.Book(name='第%s书' % i, price=i))
        models.Book.objects.bulk_create(list)
        return Response({
            'status': 0,
            'message': 'ok'
        })

简单分页

from rest_framework.pagination import PageNumberPagination
class Books(APIView):
    authentication_classes = []
    permission_classes = []
    throttle_classes = []

    def get(self, request):
        # 没有分页的所有数据
        book_list = models.Book.objects.all()
        # 完成分页
        # 1)初始化分页对象
        page_simple = PageNumberPagination()
        # 2)配置分页对象
        # page_simple.page_size = api_settings.PAGE_SIZE
        # 一页显示的条数
        page_simple.page_size = 5
        # /books/?pages = 3 默认page
        page_simple.page_query_param = 'pages'
        # /books/?pages=3&line=10 用户可以自定义访问一页有多少数据
        page_simple.page_size_query_param = 'line'
        # 限制用户自定义一页最大访问的条数
        page_simple.max_page_size = 10
        # 3)操作分页后一页的数据
        book_page_list = page_simple.paginate_queryset(book_list,request,self)
        # 将一页的数据序列化后返回给前台
        book_data = objectjson.BookJson(book_page_list, many=True).data
        return Response({
            'status': 0,
            'message': 'ok',
            'results': book_data
        })

偏移分页

from rest_framework.pagination import LimitOffsetPagination
class Books(APIView):
    authentication_classes = []
    permission_classes = []
    throttle_classes = []
    def get(self, request):
        # 没有分页的所有数据
        book_list = models.Book.objects.all()
        # 完成分页
        # 1)初始化分页对象
        page_limit = LimitOffsetPagination()
        # 2)配置分页对象
        # 一页显示的条数
        page_limit.default_limit = 5
        # 自定义一页获取的条数
        page_limit.limit_query_param = 'limit'
        # 从哪条数据开始查
        page_limit.offset_query_param = 'offset'
        # 自定义最大获取一页的条数
        page_limit.max_limit=8
        # 3)操作分页数据
        book_page_list = page_limit.paginate_queryset(book_list, request, self)
        # 将一页的数据序列化后返回给前台
        book_data = objectjson.BookJson(book_page_list, many=True).data
        return Response({
            'status': 0,
            'message': 'ok',
            'results': book_data
        })
       # return page_limit.get_paginated_response(book_data)  # 内部提供的Response对象

游标分页

from rest_framework.pagination import CursorPagination
class Books(APIView):
    authentication_classes = []
    permission_classes = []
    throttle_classes = []

    def get(self, request):
        book_list = models.Book.objects.all()
        # 完成分页
        # 1)初始化分页对象
        page_cursor = CursorPagination()
        # 2)配置分页对象
        # 一页的条数
        page_cursor.page_size = 10
        # 排序的字段可以正向也可以反向
        page_cursor.ordering = 'id'
        # 游标的关键字
        page_cursor.cursor_query_param = 'cursor'
        # 3)操作分页数据
        book_page_list = page_cursor.paginate_queryset(book_list, request, self)
        book_data = objectjson.BookJson(book_page_list, many=True).data

        return Response({
            'status': 0,
            'message': 'ok',
            'previous': page_cursor.get_previous_link(),  # 上一页
            'next': page_cursor.get_next_link(),  # 下一页
            'results': book_data
        })
原文地址:https://www.cnblogs.com/ShenJunHui6/p/10899041.html