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
也能够再基于django-filter扩写,使得功能更强大 1 写一个类MyFilter,继承BaseFilterBackend 2 重写filter_queryset方法,在该方法内部进行过滤(本身设置的过滤条件) 3 返回queryset对象(过滤后的queryset对象) 4 配置在视图类中 filter_backends = [MyFilter,] #若是是一个类能够直接写成filter_backends = MyFilter,由于源码里面本身会list一下,变成列表
代码实现:源码分析
略spa
-在视图类中配置 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排