前提:过滤、排序、搜索、分页全部都是针对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分页类