分页功能
接口中只有查询全部数据接口有时候数据量非常大,所以需要用到分页功能,在rest_framework中提供了三种分页的方法
一.PageNumberPagination
第一步:定义一个分页类继承PageNumberPagination
from rest_framework.pagination import PageNumberPaginationclass CsPageNumberPagination(PageNumberPagination):page_size = 5 # 每页显示的条数page_query_param = 'page' # 查询第几页的参数page_size_query_param = 'size' # 查询页显示的条数max_page_size = 10 # 限制通过size查询最大的条数
第二步:在前端访问形式
GET http://127.0.0.1:8000/books/?page=2 # 显示第二页数据 GET http://127.0.0.1:8000/books/?page=2&size=4 # 查询第二页每页显示4条
分页类PageNumberPagination中定义参数
page_size:每页显示的条数
page_query_param:前端发送的页数关键字名,默认为"page"
page_size_query_param:前端发送的页数数目关键字名,默认为None
max_page_size:限制通过size查询每页最大的条数
二.LimitOffsetPagination
第一步:定义一个分页类继承LimitOffsetPagination
from rest_framework.pagination import LimitOffsetPaginationclass CsLimitOffsetPagination(LimitOffsetPagination):default_limit = 2 # 每页显示的条数limit_query_param = 'limit # 这一页显示数据数offset_query_param = 'offset' # 从第几条开始取几条max_limit = 5 # 限制最多显示条数
第二步:在前端访问形式
GET http://127.0.0.1:8000/books/?limit=4 # 这一页显示4条数据 GET http://127.0.0.1:8000/books/?offset=3&limit=4 # 从第三条开始取四条数据
分页类LimitOffsetPagination中定义参数
default_limit:每页显示的条数
limit_query_param:limit参数名,默认为"limit"
offset_query_param:offset参数名,默认为'offset'
max_limit:限制最大显示的条数
三.CursorPagination
第一步:定义一个分页类继承CursorPagination
from rest_framework.pagination import CursorPaginationclass CsCursorPagination(CursorPagination): # 只能上一页和下一页,它的分页效率是最高的,高于上面所有的分页方式,大数据量的分页,建议使用这种cursor_query_param = 'cursor'page_size = 3 #每页显示条数ordering = 'id' # 排序,必须是表中得字段
第二步:在前端访问形式
GET http://127.0.0.1/four/books/ # 首页,第一页 GET http://127.0.0.1/four/books/?cursor=cD03 # 点击上一页 or 上一页自动生成的
四.在视图类中使用
三种不同的分类方式在视图类中只有继承了GenericAPIView才能使用,如果继承APIView需要自己写
from .pagination import CsPageNumberPagination, CsLimitOffsetPagination, CsCursorPagination # 必须继承GenericAPIView才有这个类属性 class BookView(ViewSetMixin, ListAPIView, CreateModelMixin):# pagination_class字段选择分页类pagination_class = CsPageNumberPagination、CsLimitOffsetPagination、CsCursorPaginationqueryset = Book.objects.all()serializer_class = BookSerializer
排序功能
只有查询所有数据的接口需要涉及到排序,其它接口不需要,且必须继承了GenericAPIView+ListModelMixin的视图类上使用
在视图类中进行配置
from rest_framework.filters import OrderingFilter class BookView(ViewSetMixin, ListAPIView, CreateModelMixin):queryset = Book.objects.all()serializer_class = BookSerializer# 排序类的配置filter_backends=[OrderingFilter,]# 指定按id、price字段排序ordering_fields=['id','price']
前端访问形式
GET http://127.0.0.1:8000/books/?ordering=price,id # 先按价格的升序排,如果价格一样再按id的升序排 GET http://127.0.0.1:8000/books/?ordering=-price,-id # 先按价格的降序排,如果价格一样再按id的降序排
ps:分页和排序能一起用,但是先排序再分页
过滤功能
过滤和分页、排序功能一样都是查询所有数据才需要涉及到,其它接口都不需要,restful规范中有一条请求地址中带过滤条件:分页、排序、过滤统称为过滤所以都可以在请求中带条件
在视图类中进行配置
过滤和排序一样都在rest_framework.filters中
from rest_framework.filters import SearchFilter class BookView(ViewSetMixin, ListAPIView, CreateModelMixin):queryset = Book.objects.all()serializer_class = BookSerializer# 指定过滤类filter_backends=[SearchFilter,]# 指定过滤字段search_fields=['name','publish']
前端访问形式
GET http://127.0.0.1:8000/books/?search=我 # 只要name或publish中带有我就都能过滤出来
ps:内置过滤类只能通过search写条件,如果配置了多个过滤字段则条件间是或者关系