分页组件
基础分页(常用)
方法一: 直接使用 drf 分页类,在视图中完成分页类的必要配置 from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination, CursorPagination class CourseViewSet(GenericViewSet, ListModelMixin): queryset = models.Course.objects.filter(is_delete=False, is_show=True).all() serializer_class = serializers.CourseSerializer pagination_class = PageNumberPagination PageNumberPagination.page_size = 1
自定义分页
方法二: 自定义分页类继承 drf 分页类,在自定义分页类中完成配置,视图类中使用自定义分页类 1 重写分页类,自定义同名类继承 drf 的分页类 2 完成必要的配置 3 将重写的分页类配置给群查需求的视图类
pagination.py
from rest_framework.pagination import PageNumberPagination as DrfPageNumberPagination class PageNumberPagination(DrfPageNumberPagination): # 默认一页显示的条数 page_size = 2 # url 中携带页码的 key page_query_param = 'page' # url 中用户携带自定义一页条数的 key page_size_query_param = 'page_size' # 用户最大可自定义一页的条数 max_page_size = 2
views.py
# 导入自己的类 from . import pagination from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination, CursorPagination class CourseViewSet(GenericViewSet, ListModelMixin): queryset = models.Course.objects.filter(is_delete=False, is_show=True).all() serializer_class = serializers.CourseSerializer # 一行 pagination_class = pagination.PageNumberPagination
偏移分页
pagination.py
from rest_framework.pagination import LimitOffsetPagination as DrfLimitOffsetPagination class LimitOffsetPagination(DrfLimitOffsetPagination): # 默认一页显示的条数 default_limit = 1 # url 中用户携带自定义一页条数的 key limit_query_param = 'limit' # url 中用户携带自定义偏移条数的 key offset_query_param = 'offset' # 用户最大可自定义一页的条数 max_limit = 3
views.py
... # 偏移分页器,没有固定页码,自定义从偏移量开始网后续查询自定义条数 # http://127.0.0.1:8000/course/free/?offset=1&limit=2 pagination_class = pagination.LimitOffsetPagination
游标分页(了解)
pagination.py
# 游标分页器 from rest_framework.pagination import CursorPagination as DrfCursorPagination class CursorPagination(DrfCursorPagination): # 默认一页显示的条数 page_size = 2 # url中携带页码的key(编码后的结果) cursor_query_param = 'cursor' # url中用户携带自定义一页条数的key page_size_query_param = 'page_size' # 用户最大可自定义一页的条数 max_page_size = 3 # 游标分页器的特殊点: # 1)如果视图类没有配 排序过滤组件filter_backends = [OrderingFilter],采用 ordering 设置的作为默认排序规则 # 2)如果视图类配了 排序过滤组件filter_backends = [OrderingFilter],url请求必须带上ordering排序规则,因为默认排序规则失效 # 注:因为游标分页是基于排序后结果上的分页 ordering = '-price'
过滤组件
搜索组件
""" 搜索组件 1)在视图文件views.py中导入drf的搜索组件 from rest_framework.filters import SearchFilter 2)将搜索组件配置给群查接口视图类的filter_backends filter_backends = [SearchFilter] 3)配置视图类关联的Model表参与搜索的字段 search_fields = ['name', 'id'] 4)前台访问该群查接口,采用拼接参数方式用search关键字将搜索目标提供给后台 http://127.0.0.1:8000/course/free/?search=2 # id或name中包含2的所有结果 """
自定义过滤组件
自定义过滤器
1)自定义类实现filter_queryset方法即可,接收request, queryset, view参数
2)制定过滤条件,将过滤成功后的queryset返回即可,如果过滤失败,返回原样的queryset
3)将自定义过滤类配置给群查视图类的filter_backends
fiters.py
# 前台接口:/course/free/?count=2 ,代表只对前台返回2条数据 class CountFilter: def filter_queryset(self, request, queryset, view): count = request.query_params.get('count', None) try: # 结论:drf的搜索组件和排序组件都是建立在表的所有数据基础上的过滤规则,所以该自定义过滤类在视图类配置中 # filter_backends = [SearchFilter, OrderingFilter, CountFilter] 必须在前两者之后 return queryset[:int(count)] except: return queryset
views.py
from rest_framework.filters import SearchFilter, OrderingFilter from . import pagination from .filters import CountFilter from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination, CursorPagination class CourseViewSet(GenericViewSet, ListModelMixin): queryset = models.Course.objects.filter(is_delete=False, is_show=True).all() serializer_class = serializers.CourseSerializer filter_backends = [SearchFilter, OrderingFilter, CountFilter] # orderingFilter 排序 http://127.0.0.1:8000/course/free/?ordering=-price,id search_fields = ['name', 'id']