过滤 排序

  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

 

posted @ 2021-05-23 19:43  mofr  阅读(70)  评论(0)    收藏  举报