准备
# 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
})