排序与分页Pagination

匿名 (未验证) 提交于 2019-12-03 00:37:01

对于列表数据,REST framework提供了OrderingFilter过滤器来帮助我们快速指明数据按照指定字段进行排序。

在类视图中设置filter_backends,使用rest_framework.filters.OrderingFilter过滤器,REST framework会在请求的查询字符串参数中检查是否包含了ordering参数,如果包含了ordering参数,则按照ordering参数指明的排序字段对数据集进行排序。

前端可以传递的ordering参数的可选字段值需要在ordering_fields中指明。

示例:

class BookListView(ListAPIView):     queryset = BookInfo.objects.all()     serializer_class = BookInfoSerializer     filter_backends = [OrderingFilter]     ordering_fields = ('id', 'bread', 'bpub_date')  # 127.0.0.1:8000/books/?ordering=-bread

REST framework提供了分页的支持。

我们可以在配置文件中设置全局的分页方式,如:

REST_FRAMEWORK = {     'DEFAULT_PAGINATION_CLASS':  'rest_framework.pagination.PageNumberPagination',     'PAGE_SIZE': 100  # 每页数目 } 

也可通过自定义Pagination类,来为视图添加不同分页行为。在视图中通过pagination_clas属性来指明。

class LargeResultsSetPagination(PageNumberPagination):     page_size = 1000     page_size_query_param = 'page_size'     max_page_size = 10000 
class BookDetailView(RetrieveAPIView):     queryset = BookInfo.objects.all()     serializer_class = BookInfoSerializer     pagination_class = LargeResultsSetPagination 

注意:如果在视图内关闭分页功能,只需在视图内设置

pagination_class = None 

PageNumberPagination

前端访问网址形式:

GET  http://api.example.org/books/?page=4 

可以在子类中定义的属性:

  • page_size 每页数目
  • page_query_param 前端发送的页数关键字名,默认为"page"
  • page_size_query_param 前端发送的每页数目关键字名,默认为None
  • max_page_size 前端最多能设置的每页数量
from rest_framework.pagination import PageNumberPagination  class StandardPageNumberPagination(PageNumberPagination):     page_size_query_param = 'page_size'     max_page_size = 10  class BookListView(ListAPIView):     queryset = BookInfo.objects.all().order_by('id')     serializer_class = BookInfoSerializer     pagination_class = StandardPageNumberPagination  # 127.0.0.1/books/?page=1&page_size=2 

2)LimitOffsetPagination

前端访问网址形式:

GET http://api.example.org/books/?limit=100&offset=400 

可以在子类中定义的属性:

  • default_limit 默认限制,默认值与PAGE_SIZE设置一直
  • limit_query_param limit参数名,默认'limit'
  • offset_query_param offset参数名,默认'offset'
  • max_limit 最大limit限制,默认None
from rest_framework.pagination import LimitOffsetPagination  class BookListView(ListAPIView):     queryset = BookInfo.objects.all().order_by('id')     serializer_class = BookInfoSerializer     pagination_class = LimitOffsetPagination  # 127.0.0.1:8000/books/?offset=3&limit=2

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