分页,过滤,搜索,排序

分页组件

基础分页(常用)

方法一:
直接使用 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']

猜你喜欢

转载自www.cnblogs.com/kai-/p/12423372.html