• 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排
  • 相关阅读:
    学习Python中的集合
    ubuntu14.04下 安装matlabR2015b遇到的一些问题及其解决方法
    matlab的一些关于块分类的函数~~~
    20145207 《Java程序设计》第二周学习总结
    20145207 调查问卷
    20145207 《Java程序设计》第一周学习总结
    10、装饰者模式
    9、观察者模式
    8、迭代器模式
    7、适配器模式
  • 原文地址:https://www.cnblogs.com/guojieying/p/13959027.html
Copyright © 2020-2023  润新知