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 获取进程pid号的方法
Mar 10 Python
Python3实现连接SQLite数据库的方法
Aug 23 Python
Python实现根据IP地址和子网掩码算出网段的方法
Jul 30 Python
Python处理json字符串转化为字典的简单实现
Jul 07 Python
Python表示矩阵的方法分析
May 26 Python
将Dataframe数据转化为ndarry数据的方法
Jun 28 Python
python 字典修改键(key)的几种方法
Aug 10 Python
基于Python安装pyecharts所遇的问题及解决方法
Aug 12 Python
Python PO设计模式的具体使用
Aug 16 Python
tensorflow实现打印ckpt模型保存下的变量名称及变量值
Jan 04 Python
python Scrapy爬虫框架的使用
Jan 21 Python
Python爬虫回测股票的实例讲解
Jan 22 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常用函数的使用汇总
2013/06/08 PHP
php中smarty变量修饰用法实例分析
2015/06/11 PHP
js实现文本框中焦点在最后位置
2014/03/04 Javascript
Bootstrap使用基础教程详解
2016/09/05 Javascript
详解jQuery插件开发方式
2016/11/22 Javascript
JavaScript函数基础详解
2017/02/03 Javascript
Vue.js对象转换实例
2017/06/07 Javascript
javascript实现获取一个日期段内每天不同的价格(计算入住总价格)
2018/02/05 Javascript
详解vuex中action何时完成以及如何正确调用dispatch的思考
2019/01/21 Javascript
JQuery属性操作与循环用法示例
2019/05/15 jQuery
深入学习JavaScript中的bom
2019/05/27 Javascript
ES6中字符串的使用方法扩展
2019/06/04 Javascript
[05:16]《大圣!大圣》——DOTA2新英雄齐天大圣配音李世宏老师专访
2016/12/13 DOTA
[34:47]完美世界DOTA2联赛PWL S2 Magma vs LBZS 第一场 11.18
2020/11/18 DOTA
[48:51]完美世界DOTA2联赛PWL S2 Magma vs InkIce 第一场 11.28
2020/12/02 DOTA
Python对两个有序列表进行合并和排序的例子
2014/06/13 Python
在Django框架中设置语言偏好的教程
2015/07/27 Python
python用模块zlib压缩与解压字符串和文件的方法
2016/12/16 Python
Python编程实战之Oracle数据库操作示例
2017/06/21 Python
Python如何抓取天猫商品详细信息及交易记录
2018/02/23 Python
Django 浅谈根据配置生成SQL语句的问题
2018/05/29 Python
Python Grid使用和布局详解
2018/06/30 Python
Django多数据库的实现过程详解
2019/08/01 Python
详解用Python为直方图绘制拟合曲线的两种方法
2019/08/21 Python
Python 实现日志同时输出到屏幕和文件
2020/02/19 Python
属性与 @property 方法让你的python更高效
2020/09/21 Python
Skyscanner阿联酋:全球领先的旅游搜索平台
2017/11/25 全球购物
咖啡蛋糕店创业计划书
2014/01/28 职场文书
资金主管岗位职责范本
2014/03/04 职场文书
忠诚教育心得体会
2014/09/03 职场文书
群众路线教育实践活动对照检查材料
2014/09/22 职场文书
幼师自荐信范文
2015/03/06 职场文书
公司清洁工岗位职责
2015/04/15 职场文书
学校运动会感想
2015/08/10 职场文书
演讲稿之我的初心我的成长
2019/08/12 职场文书
springboot用户数据修改的详细实现
2022/04/06 Java/Android