restful中的分页
普通分页
普通分页类似于Django中的分页
源码
class PageNumberPagination(BasePagination): """ A simple page number based style that supports page numbers as query parameters. For example: http://api.example.org/accounts/?page=4 http://api.example.org/accounts/?page=4&page_size=100 """ # The default page size. # Defaults to `None`, meaning pagination is disabled. page_size = api_settings.PAGE_SIZE # DjangoPaginator就是Django中的Paginator类 django_paginator_class = DjangoPaginator # Client can control the page using this query parameter. page_query_param = 'page' page_query_description = _('A page number within the paginated result set.') # Client can control the page size using this query parameter. # Default is 'None'. Set to eg 'page_size' to enable usage. page_size_query_param = None page_size_query_description = _('Number of results to return per page.') # Set to an integer to limit the maximum page size the client may request. # Only relevant if 'page_size_query_param' has also been set. max_page_size = None last_page_strings = ('last',) template = 'rest_framework/pagination/numbers.html' invalid_page_message = _('Invalid page.')
源码重要的四个参数详解
# page_size是APISettings中的默认配置,用户配置则使用用户配置,未配置则使用DEFAULTS配置,默认为None page_size = api_settings.PAGE_SIZE # ?之后的参数,如127.0.0.1/books/?page=3 page_query_param = 'page' # 每页最多显示的条数,如:127.0.0.1/books/?page=3&size=5 page_size_query_param = 'size' # 超出后每页的最多显示数 max_page_size = None
简单使用
REST_FRAMEWORK = { # 每页的显示数量 'PAGE_SIZE': 2 }
views.py文件
from rest_framework.pagination import PageNumberPagination class Book(ViewSetMixin, APIView): def get_all(self, request): response = {'status': 100, 'msg': '查询成功'} book_list = models.Book.objects.all() # 实例化产生一个分页对象 page = PageNumberPagination() # 第一个参数:要分页的数据,第二个参数request对象,第三个参数,当前视图对象 page_list = page.paginate_queryset(book_list, request, self) # 再序列化的时候,用分页之后的数据 ser = mySer.BookSerializer(instance=page_list, many=True) response['data'] = ser.data return Response(response)
或者可以自定义类来修改数据属性
from rest_framework.pagination import PageNumberPagination class MyPageNumberPagination(PageNumberPagination): page_size = 3 page_query_param = 'test' page_size_query_param = 'size' max_page_size = 5 class Book(ViewSetMixin, APIView): def get_all(self, request): response = {'status': 100, 'msg': '查询成功'} book_list = models.Book.objects.all() # 实例化产生一个分页对象 page = MyPageNumberPagination() # 第一个参数:要分页的数据,第二个参数request对象,第三个参数,当前视图对象 page_list = page.paginate_queryset(book_list, request, self) # 再序列化的时候,用分页之后的数据 ser = mySer.BookSerializer(instance=page_list, many=True) response['data'] = ser.data return Response(response)
不继承修改属性
from rest_framework.pagination import PageNumberPagination class Book(ViewSetMixin, APIView): def get_all(self, request): response = {'status': 100, 'msg': '查询成功'} book_list = models.Book.objects.all() # 实例化产生一个分页对象 # 不继承来修改对象的值 page = PageNumberPagination() page.page_size = 2 page.page_query_param = 'bb' # page = MyPageNumberPagination() # 第一个参数:要分页的数据,第二个参数request对象,第三个参数,当前视图对象 page_list = page.paginate_queryset(book_list, request, self) # 再序列化的时候,用分页之后的数据 ser = mySer.BookSerializer(instance=page_list, many=True) response['data'] = ser.data return Response(response) # 会带着链接,和总共的条数(不建议用) # return page.get_paginated_response(ser.data) # return Response(ser.data)
偏移分页
源码
class LimitOffsetPagination(BasePagination): """ A limit/offset based style. For example: http://api.example.org/accounts/?limit=100 http://api.example.org/accounts/?offset=400&limit=100 """ default_limit = api_settings.PAGE_SIZE limit_query_param = 'limit' limit_query_description = _('Number of results to return per page.') offset_query_param = 'offset' offset_query_description = _('The initial index from which to return the results.') max_limit = None template = 'rest_framework/pagination/numbers.html'
重要参数详解
# 默认显示数量 default_limit = api_settings.PAGE_SIZE # 标杆值,从哪开始偏移 offset_query_param = 'offset' # 根据标杆值的偏移量 limit_query_param = 'limit' # 超出后限制最多的显示多少条 max_limit = None
其余用法跟普通分页相同,都是实例化对象,对象调用paginate_queryset(self, queryset, request, view=None)方法,参数解释(queryset:要分页的数据,request:request对象,view:当前视图对象)
加密分页
源码
class CursorPagination(BasePagination): """ The cursor pagination implementation is necessarily complex. For an overview of the position/offset style we use, see this post: https://cra.mr/2011/03/08/building-cursors-for-the-disqus-api """ cursor_query_param = 'cursor' cursor_query_description = _('The pagination cursor value.') page_size = api_settings.PAGE_SIZE invalid_cursor_message = _('Invalid cursor') ordering = '-created' template = 'rest_framework/pagination/previous_and_next.html' # Client can control the page size using this query parameter. # Default is 'None'. Set to eg 'page_size' to enable usage. page_size_query_param = None page_size_query_description = _('Number of results to return per page.') # Set to an integer to limit the maximum page size the client may request. # Only relevant if 'page_size_query_param' has also been set. max_page_size = None # The offset in the cursor is used in situations where we have a # nearly-unique index. (Eg millisecond precision creation timestamps) # We guard against malicious users attempting to cause expensive database # queries, by having a hard cap on the maximum possible size of the offset. offset_cutoff = 1000
重要参数解释
# 按哪个字段排序 ordering = 'id' # ?后的参数 cursor_query_param = 'cursor' # 每页的显示数量 page_size = api_settings.PAGE_SIZE # 每页最多显示的条数 page_size_query_param = 'size' # 最大显示数 max_page_size = None
最后返回时调用对象的get_paginated_response(self, data)方法,返回一个加密后的页数链接
本文来自博客园,仅供参考学习,如有不当之处还望不吝赐教,不胜感激!转载请注明原文链接:https://www.cnblogs.com/rong-z/articles/10714366.html
作者:cnblogs用户