Django实现drf搜索过滤和排序过滤


Posted in Python onJune 21, 2021

前言

当我们需要对后台的数据进行过滤的时候,drf有两种,搜索过滤和排序过滤。
搜索过滤:比如我们想返回sex=1的,那么我们就可以从所有数据中进行筛选
排序过滤:比如我们想对价格进行升序排列,就可以使用排序过滤

搜索过滤

在实际的使用过程中十分简单,只需要在视图类中配置一个全局变量filter_backends,然后在search_fields确定需要通过哪个字段进行筛选

from rest_framework.filters import SearchFilter
class CarView(ListAPIView):
    serializer_class = CarSerializer
    queryset = Car.objects.all()
    # 局部配置过滤类和排序类
    filter_backends = [SearchFilter]
    # SearchFilter过滤类依赖的过滤条件
    search_fields = ['name']

之后我们在访问url地址时,就可以在url后面添加?search="宝马1系",那么我们就会过滤出name="宝马1系"的数据

Django实现drf搜索过滤和排序过滤

排序过滤

跟搜索过滤一样,只需要配置局部变量filter_backends,然后配置ordering_fields来确定通过哪个字段进行排序

from rest_framework.filters import SearchFilter, OrderingFilter
class CarView(ListAPIView):
    serializer_class = CarSerializer
    queryset = Car.objects.all()
    # 局部配置过滤类和排序类
    filter_backends = [SearchFilter, OrderingFilter]
    # SearchFilter过滤类依赖的过滤条件
    search_fields = ['name']
    # 局部配置排序类
    ordering_fields = ['price']

之后我们在访问url地址时,就可以在url后面添加?search="宝马"&ordering="price",那么我们就会过滤出所有宝马系列的车子,并且数据的排序按照车的价格从低到高排序

Django实现drf搜索过滤和排序过滤

PS:过滤功能利用的是第三方包 django_filters,搜索和排序利用的是 Django DRF 提供的 filters

from rest_framework import filters # 搜索和排序功能 # 注意:这两个是 DRF 提供的功能

from django_filters.rest_framework import DjangoFilterBackend  # DjangoFilterBackend 是精确(查找)过滤,即 字段值必须要完全一样才能匹配成功
import django_filters

class GoodsFilter(django_filters.rest_framework.FilterSet):
    """商品的过滤类"""
    min_price = django_filters.NumberFilter(field_name="price",
                                            lookup_expr="gte")  # field_name 表示要过滤字段;lookup_expr 表示 过滤时要进行的操作,gte 表示 大于等于
    max_price = django_filters.NumberFilter(field_name="price", lookup_expr="lte")  # lte 小于等于
    name = django_filters.CharFilter(field_name="name",lookup_expr="icontains")  # icontains 表示 包含(忽略大小写)

    class Meta:
        model = models.Goods  # 关联的表
        fields = ["min_price","max_price","name"]  # 过滤的字段


class GoodsPagination(PageNumberPagination):
    page_size = 10
    page_size_query_param = "page_size"
    page_query_param = "p"
    max_page_size = 100

class GoodsListViewSet(mixins.ListModelMixin,GenericViewSet):
    """商品查看"""
    queryset = models.Goods.objects.all() # 没 get_queryset() 这个过滤方法时,需要写上这一步的 queryset;有 get_queryset 方法时,则不需要写这一步,因为会自动去 get_queryset() 中找 queryset
    pagination_class = GoodsPagination
    
    # 方式三:自定义过滤功能(也包含搜索和排序功能)
    filter_backends = (DjangoFilterBackend,filters.SearchFilter,filters.OrderingFilter)  # filters.SearchFilter 表示 搜索功能;filters.OrderingFilter 表示 排序功能
    filterset_class = GoodsFilter  # 把自定义的过滤类 GoodsFilter 赋值给 filterset_class
    search_fields = ('^name', 'goods_brief')  # 搜索功能对应的字段 # '^' Starts-with search;'=' Exact matches.
    ordering_fields = ("sold_num","add_time") # 排序功能对应的字段 
    
    # 业务逻辑省略...
    
    """
    # 过滤功能方式二
    filter_backends = (DjangoFilterBackend,) # 过滤类型
    filterset_fields = ("name","shop_price")  # 过滤字段  # 这种的过滤只能满足精确过滤
    """
    
    """
    # 方式一:get_queryset()方法
    def get_queryset(self):  # 过滤方法; GenericAPIView 提供的方法
        queryset = models.Goods.objects.all()
        price_min = self.request.query_params.get("price_min",0)
        if price_min:
            queryset = queryset.filter(shop_price_gt=int(price_min))
        return queryset
    """
    
    """
    方式二:通过 django-filter
    # 1. pip install django-filter
    # 2. 把 "django-filters" 添加到 Django 的 INSTALLED_APPS 中
    # 3. 在 filter_backends 中添加 DjangoFilterBackend,在 filterset_fields 中添加 过滤字段
    这个方式的过滤是精确过滤,即 用户传过来的值必须和 对应过滤字段的值完全一样才能过滤出来;
    如果想自定义过滤功能(例如想过滤出价格区间),可通过方式三
    """
    
    """
    方式三:通过 django-filter 自定义 过滤功能
    1. 自定义一个过滤类
    2. filter_backends = (DjangoFilterBackend,)
    3. filterset_class = GoodsFilter  # 把自定义的过滤类 GoodsFilter 赋值给 filterset_class
    """

到此这篇关于Django实现drf搜索过滤和排序过滤的文章就介绍到这了,更多相关drf搜索过滤和排序过滤内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
用Python编写简单的定时器的方法
May 02 Python
Python 模板引擎的注入问题分析
Jan 01 Python
梯度下降法介绍及利用Python实现的方法示例
Jul 12 Python
python2.7实现FTP文件下载功能
Apr 15 Python
Python实现识别图片内容的方法分析
Jul 11 Python
python读取目录下最新的文件夹方法
Dec 24 Python
Python爬虫动态ip代理防止被封的方法
Jul 07 Python
python实现证件照换底功能
Aug 20 Python
pandas条件组合筛选和按范围筛选的示例代码
Aug 26 Python
树莓派升级python的具体步骤
Jul 05 Python
Python 可迭代对象 iterable的具体使用
Aug 07 Python
用PYTHON去计算88键钢琴的琴键频率和音高
Apr 10 Python
python生成可执行exe控制Microsip自动填写号码并拨打功能
详解Python自动化之文件自动化处理
Jun 21 #Python
Python Pandas pandas.read_sql_query函数实例用法分析
Jun 21 #Python
Python Pandas pandas.read_sql函数实例用法
Jun 21 #Python
浅谈Python从全局与局部变量到装饰器的相关知识
Jun 21 #Python
Python-OpenCV教程之图像的位运算详解
Python中的套接字编程是什么?
You might like
PHP的类 功能齐全的发送邮件类
2006/10/09 PHP
php实现快速排序的三种方法分享
2014/03/12 PHP
Wordpress ThickBox 添加“查看原图”效果代码
2010/12/11 Javascript
JavaScript常用对象的方法和属性小结
2012/01/24 Javascript
开发 Internet Explorer 右键功能表(ContextMenu)
2013/07/03 Javascript
Js点击弹出下拉菜单效果实例
2013/08/12 Javascript
利用try-catch判断变量是已声明未声明还是未赋值
2014/03/12 Javascript
js中直接声明一个对象的方法
2014/08/10 Javascript
jQuery实现表单步骤流程导航代码分享
2015/08/28 Javascript
JavaScript精炼之构造函数 Constructor及Constructor属性详解
2015/11/05 Javascript
JavaScript 节流函数 Throttle 详解
2016/07/04 Javascript
js获取一组日期中最近连续的天数
2017/05/25 Javascript
详解vue2.0 transition 多个元素嵌套使用过渡
2017/06/19 Javascript
js异步上传多张图片插件的使用方法
2018/10/22 Javascript
微信 jssdk 签名错误invalid signature的解决方法
2019/01/14 Javascript
Vue SPA 初次进入加载动画实现代码
2019/11/14 Javascript
快速了解Vue父子组件传值以及父调子方法、子调父方法
2020/07/15 Javascript
Nodejs在局域网配置https访问的实现方法
2020/10/17 NodeJs
让Vue响应Map或Set的变化操作
2020/11/11 Javascript
python 读取文件并替换字段的实例
2018/07/12 Python
从numpy数组中取出满足条件的元素示例
2019/11/26 Python
Django使用rest_framework写出API
2020/05/21 Python
深入了解python列表(LIST)
2020/06/08 Python
python-地图可视化组件folium的操作
2020/12/14 Python
Python将QQ聊天记录生成词云的示例代码
2021/02/10 Python
你可能不熟练的十个前端HTML5经典面试题
2018/07/03 HTML / CSS
HTML5 canvas画图并保存成图片的jcanvas插件
2014/01/17 HTML / CSS
Clarins娇韵诗美国官网:法国天然护肤品牌
2016/09/26 全球购物
英国领先的酒类网上商城:TheDrinkShop
2017/03/16 全球购物
会计师事务所审计实习自我鉴定
2013/09/20 职场文书
材料化学应届生求职信
2013/10/09 职场文书
追悼会子女答谢词
2014/01/28 职场文书
物业管理委托协议(2篇)
2014/09/23 职场文书
在职证明书模板
2015/06/15 职场文书
军训心得体会范文(2016最新篇)
2016/01/11 职场文书
Nginx代理Redis哨兵主从配置的实现
2022/07/15 Servers