drf——drf过滤,排序功能,

1、内置和第三方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的用户

2、自定制过滤器

#源码分析:    
-查询全部才会有过滤---》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

 

2、排序功能

-在视图类中配置
    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排
相关文章
相关标签/搜索