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)