django-rest-framework中过滤、排序、搜索、分页讲解

 前提:过滤、排序、搜索、分页全部都是针对list行为使用的

1. 过滤:

(1)过滤基本使用

(2)我们也可以自定义过滤器类,来达到过滤时也可以模糊匹配,而不是精准匹配, 在应用下面新建一个filters.py文件,文件中定义过滤器类

 
import django_filters
from django_filters.rest_framework import FilterSet
from .models import BookInfo


class BookInfoFilter(FilterSet):
    """图书过滤器"""
    btitle = django_filters.CharFilter(field_name="btitle")
    # 参数lookup_expr="icontains"表示过滤bcontent字段的时候,进行模糊匹配
    bcontent = django_filters.CharFilter(field_name="bcontent", lookup_expr="icontains")

    class Meta:
        model = BookInfo  # 指定过滤的模型类
        fields = ["btitle", "bcontent"]  # 指定过滤的字段

然后在视图中导入该过滤器类,并增加过滤器类属性 filter_class = BookInfoFilter

class BookViewSet(viewsets.ModelViewSet):
    """ViewSet视图集"""
    queryset = BookInfo.objects.all()
    serializer_class = BookInfoSerializer

    # 指定当前视图访问权限
    # IsAuthenticated 只有登录的用才能访问此视图中的所有接口
    permission_classes = [IsAuthenticated, MyPermission]

    # 指定过滤使用的类
    filter_class = BookInfoFilter

2. 排序

(1)局部排序配置:在视图类中指定使用的排序类

from rest_framework.filters import OrderingFilter

filter_backends = [OrderingFilter]

(2)也可以全局配置排序,在settings.py中

# drf配置项
REST_FRAMEWORK = {
    # 过滤配置项, 指定过滤后端
    "DEFAULT_FILTER_BACKENDS": ["django_filters.rest_framework.DjangoFilterBackend",  # 过滤配置
                                "rest_framework.filters.OrderingFilter"],  # 排序配置
}

然后在在视图类中添加ordering_fields类属性即可

class BookViewSet(viewsets.ModelViewSet):
    """ViewSet视图集"""
    queryset = BookInfo.objects.all()
    serializer_class = BookInfoSerializer

    # 指定当前视图访问权限
    # IsAuthenticated 只有登录的用才能访问此视图中的所有接口
    permission_classes = [IsAuthenticated, MyPermission]

    # 指定过滤使用的类
    filter_class = BookInfoFilter
    # 排序字段
    ordering_fields = ["id", "bread", "bpub_date"]

3. 搜索

(1)搜索也需要增加个配置项

# drf配置项
REST_FRAMEWORK = {
    # 过滤配置项, 指定过滤后端
    "DEFAULT_FILTER_BACKENDS": ["django_filters.rest_framework.DjangoFilterBackend",  # 过滤配置
                                "rest_framework.filters.OrderingFilter",  # 排序配置
                                "rest_framework.filters.SearchFilter"],  # 搜索配置
}

(2)在视图集中增加搜索字段的类属性即可

class BookViewSet(viewsets.ModelViewSet):
    """ViewSet视图集"""
    queryset = BookInfo.objects.all()
    serializer_class = BookInfoSerializer

    # 指定当前视图访问权限
    # IsAuthenticated 只有登录的用才能访问此视图中的所有接口
    permission_classes = [IsAuthenticated, MyPermission]

    # 指定过滤使用的类
    filter_class = BookInfoFilter
    # 排序字段
    ordering_fields = ["id", "bread", "bpub_date"]
    # 搜索字段
    search_fields = ["=btitle", "bcontent", "is_delete"]

4. 分页

(1)PageNumberPagination分页类

虽然前面settings.py中进行了全局分页配置,我们也可以自定义分页类,然后在单个视图类中指定自定义的分页类来覆盖全局中指定的

自定义分页类:

class LargeResultsSetPagination(PageNumberPagination):
    page_size = 1  # 后端中设置的每页显示条数, 此处局部配置会覆盖全局配置中的page_zie
    page_query_param = "page"  # 前端传入的页码关键字,默认值就是page,指定不指定都可以
    page_size_query_param = "page_size"  # 前端传入的每页数目关键字名
    max_page_size = 4  # 前端传入的最多能设置的每页数量,同时会覆盖后端设置的每页显示条数,如果前端传入的大于我们设置的4,那么会显示4条每页

类视图:

class BookViewSet(viewsets.ModelViewSet):
    """ViewSet视图集"""
    queryset = BookInfo.objects.all()
    serializer_class = BookInfoSerializer

    # 指定当前视图访问权限
    # IsAuthenticated 只有登录的用才能访问此视图中的所有接口
    permission_classes = [IsAuthenticated, MyPermission]

    # 指定过滤使用的类
    filter_class = BookInfoFilter
    # 排序字段
    ordering_fields = ["id", "bread", "bpub_date"]
    # 搜索字段
    search_fields = ["=btitle", "bcontent", "is_delete"]
    # 关闭分页
    # pagination_class = None
    # 指定自定义分页类
    pagination_class = LargeResultsSetPagination

(2)LimitOffsetPagination分页类

猜你喜欢

转载自blog.csdn.net/weixin_42289273/article/details/114267474