过滤组件
群查排序过滤器
drf写好的
第一步
from rest_framework.filters import OrderingFilter
第二步
局部配置过滤器
filter_backends = [OrderingFilter,]
参与排序的字段: ordering=-price,id
ordering_fields = ['price', 'id', 'students']
第三步
请求链接样式
http://127.0.0.1:8080?ordering=-price,id
价格排序完一样的按照id排序
自定义群查过滤器(限制数据的个数)
第一步
在创建的app文件夹下面创建一个filters.py
文件,名字随便
第二步
from rest_framework.filters import BaseFilterBackend
重写类继承BaseFilterBackend
,重写filter_queryset方法
from rest_framework.filters import BaseFilterBackend
class LimitFilter(BaseFilterBackend):
def filter_queryset(self, request, queryset, view):
li = request.query_params.get('li')
try:
# 取得到返回的是处理过后的queryset, 但是li可能是不是数字
return queryset[:int(li)]
except:
# 取不到返回原来的
return queryset
第三步
导入自定义过滤器
from .filters import LimitFilter
第四步
配置过滤器
filter_backends = [LimitFilter,]
群查搜索过滤器
第一步
from rest_framework.filters import SearchFilter
第二步
配置过滤器
filter_backends = [SearchFilter,]
第三步
配置可搜索的字
search_fields = ['name', 'brief']
search解决的是全文搜索(也就是当前接口的序列化类连接的表中的字段
)
连表的字段无法查询
第四步
请求链接样式
http://127.0.0.1:8080?search=python
群查分页器过滤器
一个类只能配置一个分页器
第一步
在创建的app文件夹下面创建一个paginations.py
文件,名字随便
第二步
from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination, CursorPagination
重写类继承
BaseFilterBackend(普通分页器)
,LimitOffsetPagination(偏移分页器)
,CursorPagination(排序分页器)
重写filter_queryset方法
代码:
from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination, CursorPagination
# 普通分页器
class CoursePageNumberPagination(PageNumberPagination):
# 默认一页条数
page_size = 2
# 选择哪一页的key
page_query_param = 'page'
# 一般不开放自定义
# 用户自定义一页条数
page_size_query_param = 'page_size'
# 用户自定义一页最大控制条数
max_page_size = 10
# 偏移分页器(可以从第几条加载到第几条)
class CourseLimitOffsetPagination(LimitOffsetPagination):
# 默认一页条数
default_limit = 2
# 从offset开始往后显示limit条
limit_query_param = 'limit'
offset_query_param = 'offset'
max_limit = 2
# 排序分页器(按照规则排序并且分页)
class CourseCursorPagination(CursorPagination):
cursor_query_param = 'cursor'
page_size = 2
page_size_query_param = 'page_size'
max_page_size = 2
# ordering = 'id' # 默认排序规则,不能和排序过滤器OrderingFilter共存
第三步
导入自定义分页器
from .paginations import CoursePageNumberPagination, CourseLimitOffsetPagination, CourseCursorPagination
第四步
配置自定义分页器(同一个接口下面只能配置一个分页器)
pagination_class = CoursePageNumberPagination
pagination_class = CourseLimitOffsetPagination
pagination_class = CourseCursorPagination
分类筛选过滤器
安装django-filter插件
需要安装 django-filter
插件
pip install django-filter
django-filter里面重写了django
和rest_framework
的filter
,意味着既可以做前后端 不分离的分类筛选,也可以做前后端分离的分类筛选.
分类过滤器的使用
第一步
安装django-filter
模块
第二步
导包
from django_filters.rest_framework import DjangoFilterBackend
第三步
配置分类过滤器
filter_backends = [DjangoFilterBackend,]
第四步
配置分类字段(必须是序列化表中有的字段,可以是外键字段)
filter_fields = ['course_category']
第五步
请求链接样式
http://127.0.0.1:8080?course_category=2
区间筛选过滤器
基于django-filter
插件, 完成指定区间筛选(一般是针对于数字字段)
第一步
在创建的app文件夹下面创建一个filters.py
文件,名字随便
第二步
导入所需模块
from django_filters.rest_framework.filterset import FilterSet
from django_filters.rest_framework import filters
继承 FilterSet
类似于写序列化类的方式重写
NumberFilter
: filters提供的数据类型,还有很多对应的数据类型
lte
: 小于等于
gte
: 大于等于
field_name
: 指定可以区间分类的字段,而且必须是序列化类中的序列化的字段
代码:
from django_filters.rest_framework.filterset import FilterSet
from django_filters.rest_framework import filters
from . import models
class CourseFilterSet(FilterSet):
# 价格小于指定价格(lte)
max_price = filters.NumberFilter(field_name='price', lookup_expr='lte')
# 价格大于指定价格(gte)
min_price = filters.NumberFilter(field_name='price', lookup_expr='gte')
class Meta:
model = models.Course
fields = ['price', 'max_price', 'min_price']
第三步
导包
from django_filters.rest_framework import DjangoFilterBackend
导入自定义分类过滤器类
from .filters import CourseFilterSet
配置过滤器类
filter_backends = [DjangoFilterBackend]
配置
filter_fields = ['course_category']
- django_filter帮我们写的
filter_class = CourseFilterSet
- 我们自己自定义的分类过滤