1 DRF提供了内置过滤组件Filtering,可以结合url路径的改变获取想要的数据,当然用户不可能在url访问路径中自己设置过滤条件,肯定是后端开发人员将前端页面中的与某些数据提示信息挂钩的按钮(点击事件)跟url路径中设置的检索条件绑定在一起,用户只要按需求点击相应按钮,即可获取想要的数据资源。
2
3 一、通过django-filter增强支持:
4
5 pip install django-filter
6 二、在 settings.py 配置文件中增加过滤后端的设置:
7
8 # 需要将django-filter以应用的形式进行注册
9 INSTALLED_APPS = [
10 ...
11 'django_filters',
12 ]
13
14
15 REST_FRAMEWORK = {
16 ...
17 'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',)
18 }
19 三、在视图中添加filter_fields属性,指定可以过滤的字段
20
21 from rest_framework.generics import ListAPIView
22
23
24 class StudentListView(ListAPIView):
25
26 queryset = Student.objects.all()
27 serializer_class = StudentSerializer
28
29 # 指定按照'age'和'sex'字段的不同值展示相应的数据
30 filter_fields = ('age', 'sex')
31 四、url路径设置过滤字段的值
32
33 # 在所有学生信息数据中过滤出性别为男生的数据即'sex=1':
34 127.0.0.1:8000/four/students/?sex=1
35
36 # 在所有学生信息数据中过滤出年龄为18岁的数据即'age=18':
37 127.0.0.1:8000/four/students/?age=18
38 在展示列表数据时,DRF提供了OrderingFilter过滤器来帮助我们将展示的所有数据按照指定字段值的大小进行排序。
39
40 一、使用方法:
41
42 在类视图中设置filter_backends 属性,使用rest_framework.filters.OrderingFilter过滤器,DRF会在请求的查询字符串参数中检查是否包含了ordering参数,如果包含了ordering参数,则按照ordering参数指明的排序字段对数据集进行排序后展示。
43
44 前端可以传递的ordering参数的可选字段值需要在ordering_fields属性中指明。
45
46 示例:
47
48 from rest_framework.generics import ListAPIView
49 from rest_framework.filters import OrderingFilter
50
51
52 class StudentListView(ListAPIView):
53 queryset = Student.objects.all()
54 serializer_class = StudentModelSerializer
55
56 #
57 filter_backends = [OrderingFilter,]
58
59 # 指明按照'id'和'age'字段的值的大小对数据进行排序后展示
60 ordering_fields = ('id', 'age')
61 url路径中设置按照指定字段排序的排序方式(倒序/升序)
62
63 # 必须是ordering = 某个值
64
65 # 'ordering=-id'即表明将所有学生信息数据按照ID值的大小倒序展示
66 127.0.0.1:8000/four/students/?ordering=-id
67
68
69 # 'ordering=-age '即表明将所有学生信息数据按照年龄大小倒序展示
70 127.0.0.1:8000/four/students/?ordering=-age
71 如果需要过滤以后再次进行排序,则需要两者结合!
72
73 示例如下:
74
75 from rest_framework.generics import ListAPIView
76 from students.models import Student
77 from .serializers import StudentModelSerializer
78
79 # 需要使用'DjangoFilterBackend'才能结合使用
80 from django_filters.rest_framework import DjangoFilterBackend
81
82
83 class Student3ListView(ListAPIView):
84 queryset = Student.objects.all()
85 serializer_class = StudentModelSerializer
86
87 # 指定按照'age'和'sex'字段的不同值展示相应的数据
88 filter_fields = ('age', 'sex')
89
90 # 因为'filter_backends'是局部过滤配置,局部配置会覆盖'settinigs.py'文件中的全局配置,所以需要再次声明过滤组件核心类'DjangoFilterBackend',否则过滤功能会失效
91 filter_backends = [OrderingFilter, DjangoFilterBackend]
92
93 # 指明按照'id'和'age'字段的值的大小对数据进行排序后展示
94 ordering_fields = ('id', 'age')
95 访问该接口时若不设置二者结合使用的条件
96
97 即:http://127.0.0.1:8080/CAPIView/students/
98
99 数据展示如下:
100
101 Students Capi
102
103 GET /CAPIView/students/
104
105 HTTP 200 OK
106 Allow: GET, POST, HEAD, OPTIONS
107 Content-Type: application/json
108 Vary: Accept
109
110 [
111 {
112 "id": 2,
113 "name": "雄霸a",
114 "sex": true,
115 "age": 40,
116 "class_null": "8",
117 "description": "三分归元气"
118 },
119 {
120 "id": 6,
121 "name": "aaaaa",
122 "sex": true,
123 "age": 20,
124 "class_null": "",
125 "description": null
126 },
127 {
128 "id": 7,
129 "name": "1234",
130 "sex": true,
131 "age": 18,
132 "class_null": "",
133 "description": "hello666"
134 },
135 {
136 "id": 8,
137 "name": "1234",
138 "sex": true,
139 "age": 30,
140 "class_null": "0",
141 "description": "ndjskkvp"
142 },
143 {
144 "id": 11,
145 "name": "查询接口",
146 "sex": false,
147 "age": 23,
148 "class_null": "10",
149 "description": "春风十里"
150 },
151 {
152 "id": 12,
153 "name": "你好啊",
154 "sex": false,
155 "age": 34,
156 "class_null": "1",
157 "description": "就开始看看"
158 },
159 {
160 "id": 13,
161 "name": "我去啊",
162 "sex": false,
163 "age": 10,
164 "class_null": "9",
165 "description": "这个drf提供的封装好的视图子类真牛逼,我服了"
166 }
167 ]
168
169 当url路径中设置二者结合使用的条件
170
171 即:http://127.0.0.1:8080/CAPIView/students/?sex=1&ordering=-age
172
173 # 先过滤出性别为男生的数据再按照年龄倒序展示
174 127.0.0.1:8000/books/?sex=1&ordering=-age
175 数据展示如下:
176
177 Students Capi
178
179 GET /CAPIView/students/?sex=1&ordering=-age
180
181 HTTP 200 OK
182 Allow: GET, POST, HEAD, OPTIONS
183 Content-Type: application/json
184 Vary: Accept
185
186 [
187 {
188 "id": 2,
189 "name": "雄霸a",
190 "sex": true,
191 "age": 40,
192 "class_null": "8",
193 "description": "三分归元气"
194 },
195 {
196 "id": 8,
197 "name": "1234",
198 "sex": true,
199 "age": 30,
200 "class_null": "0",
201 "description": "ndjskkvp"
202 },
203 {
204 "id": 6,
205 "name": "aaaaa",
206 "sex": true,
207 "age": 20,
208 "class_null": "",
209 "description": null
210 },
211 {
212 "id": 7,
213 "name": "1234",
214 "sex": true,
215 "age": 18,
216 "class_null": "",
217 "description": "hello666"
218 }
219 ]
220 当二者结合使用时,就可以先过滤后再进行排序的展示数据了,感觉挺好用的
221
222
223
224
225
226 转载本文链接:https://www.cnblogs.com/fengting0913/p/13496134.html