drf过滤、排序、分页器

drf内置的排序、过滤功能使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
使用的话十分的简单
from rest_framework.filters import OrderingFilter, SearchFilter 导入这两个类,在可以进行查询的接口中进行一定的配置即可

#过滤功能
filter_backends = [SearchFilter,]
search_fields=('name',) # 表中的字段,会去表中该字段进行匹配
路径中的写入方式
http://127.0.0.1:8000/students/?search=e # 只能写search

#排序功能
filter_backends = [OrderingFilter]
ordering_fields = ('price', 'id') #表中的字段,可以以这些字段进行排序
路径中的书写方式
http://127.0.0.1:8000/students/?ordering=-age # 必须写ordering

django-filter的使用

1
2
3
4
5
6
7
8
1.先下载django-filter
2.导入类
from django_filters.rest_framework import DjangoFilterBackend
3.在视图类中进行配置
filter_backends = [DjangoFilterBackend]
filter_fields = ('name', 'price') #模型中的字段,以这些为查询条件
4.路径中的参数
http://127.0.0.1:8000/book/?name=西游记 #为精准匹配,不是模糊查询

自定义过滤器

1
2
3
4
5
6
7
1.导入基类
from rest_framework.filters import BaseFilterBackend
2.继承并重写他的filter_queryset方法
def filter_queryset(self, request, queryset, view):
return queryset #必须返回一个queryset对象
3.直接在视图类里使用
filter_backends = [Myfilter.MyFilter]

drf分页器的使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
drf为我们提供了3种分页器
1.PageNumberPagination
我们可以新建一个类然后继承该类,然后在该类中添加4个属性
page_size = 1 # 每页显示多少条
page_query_param = 'page' # 查询参数
eg:http://127.0.0.1:8000/book/?page=1
page_size_query_param = 'size' # 查询的时候你按什么名称来指定每页显示多少条
eg:http://127.0.0.1:8000/book/?size=3 # 指定每页显示3条,不指定按默认之前配的page_size来
max_page_size = 10 # 每页最多显示多少条

2.LimitOffsetPagination
default_limit = 2 # 默认条数
limit_query_param = 'limit' # 查询时,指定查询多少条
offset_query_param = 'offset' # 查询时,指定的起始位置是哪
max_limit = None # 查询时,最多返回多少条

3.CursorPagination
cursor_query_param = 'cursor' # 查询的时候,指定的查询方式
page_size = 2 # 每页显示多少条
ordering = '-created' # 排序方式
page_size_query_param = 'size' # 查询的时候指定每页显示多少条
max_page_size = None #每页最多显示多少条

使用方式在视图类中添加
pagination_class = MyPage


7 APIView的分页模式
-新建一个类,继承普通分页,重写四个属性
-视图类写法如下
class StudentApiView(APIView):
def get(self,request):
student_list=Student.objects.all()
page=MyPageNumberPagination()# 实例化得到对象
# 只需要换不同的分页类即可
res=page.paginate_queryset(student_list,request,self)# 开始分页
ser=StudentSerializer(res,many=True)
return page.get_paginated_response(ser.data) # 返回数据