1. 过滤
1.1 安装
pip3 install django-filter
1.2 注册
INSTALLED_APPS = [
'django_filters',
]
1.3 使用
1.3.1 全局使用
1.3.1.1 settings配置
REST_FRAMEWORK = {
'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',)
}
1.3.1.2 视图使用
class StudentListView(ListAPIView):
queryset = Student.objects.all()
serializer_class = StudentSerializer
filter_fields = ('age', 'sex')
# 127.0.0.1:8000/four/students/?sex=1
1.3.2 局部使用
1.3.2.1 视图·
# 第一步导包过滤
from django_filters.rest_framework import DjangoFilterBackend
class CourseListAPIView(ListAPIView):
"""课程列表"""
queryset = models.Course.objects.filter(is_deleted=False, is_show=True).order_by('orders')
serializer_class = CourseListModelSerializer
# 第二步 配置
filter_backends = [DjangoFilterBackend, ]
# 设置过滤的关键字段 ?course_category=1
filter_fields = ('course_category',)
2. 排序
2.1 局部使用
from rest_framework.filters import OrderingFilter
class Students7View(ModelViewSet):
queryset = models.Student.objects.all() # 必须写这个参数 ,方法中使用的self.get_queryset()方法自动获取到queryset属性数据
serializer_class = StudentModelSerializer # 非必填属性,self.get_serializer获取到serializer_class制定的序列化器类
filter_backends = [OrderingFilter]
ordering_fields = ('id', 'age')
# students/?ordering=-id
# 127.0.0.1:8000/books/?ordering=-age
# 必须是ordering=某个值
# -id 表示针对id字段进行倒序排序
# id 表示针对id字段进行升序排序
3. 过滤+排序
# 过滤
from django_filters.rest_framework import DjangoFilterBackend #需要使用一下它才能结合使用
# 排序
from rest_framework.filters import OrderingFilter
class Student3ListView(ListAPIView):
queryset = Student.objects.all()
serializer_class = StudentModelSerializer
# 因为filter_backends是局部过滤配置,局部配置会覆盖全局配置,所以需要重新把过滤组件核心类再次声明,
# 否则过滤功能会失效
filter_backends = [OrderingFilter,DjangoFilterBackend]
filter_fields = ('age', 'sex')
ordering_fields = ('id', 'age')
# 127.0.0.1:8000/books/?sex=1&ordering=-age
4.分页
4.1 PageNumberPagination
# 分页
from rest_framework.pagination import PageNumberPagination
class CustomPagenation(PageNumberPagination):
page_size = 5 # 每页显示的个数
page_query_param = 'page' # 查询参数 ?page=3
page_size_query_param = 'size' # 前端自定义查询的数量,?size=10
max_page_size = 100 # 前端自定义显示的字段条数的最大限制
class CourseListAPIView(ListAPIView):
"""课程列表"""
queryset = models.Course.objects.filter(is_deleted=False, is_show=True).order_by('orders')
serializer_class = CourseListModelSerializer
pagination_class = CustomPagenation
GET http://127.0.0.1:8000/students/?page=4
4.2 LimitOffsetPagination
from rest_framework.pagination import LimitOffsetPagination
class StandardLimitOffsetPagination(LimitOffsetPagination):
# 默认每一页查询的数据量,类似上面的page_size
default_limit = 2
limit_query_param = "size"
offset_query_param = "start"
class StudentAPIView(ListAPIView):
queryset = Student.objects.all()
serializer_class = StudentModelSerializer
# 调用查询偏移分页类
pagination_class = StandardLimitOffsetPagination
GET http://127.0.0.1/four/students/?limit=100&offset=400 #从下标为400的记录开始,取100条记录
可以在子类中定义的属性:
- default_limit 默认限制,每页数据量大小,默认值与`PAGE_SIZE`设置一致
- limit_query_param limit参数名,默认'limit' , 可以通过这个参数来改名字
- offset_query_param offset参数名,默认'offset' ,可以通过这个参数来改名字
- max_limit 最大limit限制,默认None, 无限制
5. 过滤&分页&排序使用
5.1 过滤安装
pip3 install django-filter
5.2 过滤注册
INSTALLED_APPS = [
'django_filters',
]
5.3 使用
# 过滤
from django_filters.rest_framework import DjangoFilterBackend
# 分页
from rest_framework.pagination import PageNumberPagination
# 排序
from rest_framework.filters import OrderingFilter
class CustomPagenation(PageNumberPagination):
page_size = 5 # 每页显示的个数
page_query_param = 'page' # 查询参数 ?page=3
page_size_query_param = 'size' # 前端自定义查询的数量,?size=10
max_page_size = 100 # 前端自定义显示的字段条数的最大限制
class CourseListAPIView(ListAPIView):
"""课程列表"""
queryset = models.Course.objects.filter(is_deleted=False, is_show=True).order_by('orders')
serializer_class = CourseListModelSerializer
# 配置
filter_backends = [OrderingFilter, DjangoFilterBackend]
# 字段设置
filter_fields = ('course_category',)
ordering_fields = ('id', 'age')
pagination_class = CustomPagenation
# 路由
# 127.0.0.1:8000/books/?page=1&course_category=1&ordering=-id