drf——drf过滤,排序功能,
一、内置和第三方django-filter过滤功能
1 过滤:筛选查询结果
2 内置筛选的使用
-在视图类中配置
filter_backends =[SearchFilter,]
search_fields=('name','age') # 表模型中的字段,表示查询name或age字段里面有需要查的,可模糊查
-查询的时候
http://127.0.0.1:8000/students/?search=e #表示查name 或 age里有e的用户信息
3 第三方扩展的过滤功能
安装:
-pip3 install django-filter :注意最新版本(2.4.0)要跟django2.2以上搭配 -django-filter有很多功能,比如:模糊查询以什么开头,结尾,这个或那个等高级功能,后面会说。
使用:
-在视图类中配置
filter_backends =[DjangoFilterBackend,]
filter_fields=['name','age'] #精准过滤,表示查看name为xx,age为xx的用户,也可写一个name 或age
-查询的时候
http://127.0.0.1:8000/students/?name=lqz#查name=lqz的用户
http://127.0.0.1:8000/students/?age=18#查age=18的用户
http://127.0.0.1:8000/students/?name=lqz&age=18#查name=lili并且age=18的用户
二、自定制过滤器
#源码分析:
-查询所有才会有过滤---》list才需要过滤---》queryset = self.filter_queryset(self.get_queryset())---》GenericAPIView-->filter_queryset
def filter_queryset(self, queryset):
for backend in list(self.filter_backends):
queryset = backend().filter_queryset(self.request, queryset, self)
return queryset
自己编写
也可以再基于django-filter扩写,使得功能更强大
1 写一个类MyFilter,继承BaseFilterBackend
2 重写filter_queryset方法,在该方法内部进行过滤(自己设置的过滤条件)
3 返回queryset对象(过滤后的queryset对象)
4 配置在视图类中
filter_backends = [MyFilter,] #如果是一个类可以直接写成filter_backends = MyFilter,因为源码里面自己会list一下,变成列表
代码实现:
略
二、排序功能
-在视图类中配置
filter_backends =[OrderingFilter,]
ordering_fields=['id','age']
-查询的时候
http://127.0.0.1:8000/students/?ordering=age #按age排
http://127.0.0.1:8000/students/?ordering=-id#按-id排
http://127.0.0.1:8000/students/?ordering=-age,-id #当要排序的用户age相同时,按照-id排,是有意义的,要考虑实际应用
### 过滤后再排序
-在视图类中配置
filter_backends = [OrderingFilter,DjangoFilterBackend]
ordering_fields = ('id', 'age')
filter_fields=['name','age']
-查询的时候
http://127.0.0.1:8000/students/?name=lqz&age=19&ordering=-age,-id #筛选出name=lqz并且age=19的用户,然后按照-age排,如果age再相同,按照-id排
赞 (0)
