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通过定义一个类实例作为ftp回调方法
May 04 Python
在Linux系统上安装Python的Scrapy框架的教程
Jun 11 Python
深入浅析python定时杀进程
Jun 06 Python
动态规划之矩阵连乘问题Python实现方法
Nov 27 Python
python编程通过蒙特卡洛法计算定积分详解
Dec 13 Python
Python selenium实现微博自动登录的示例代码
May 16 Python
Python简单爬虫导出CSV文件的实例讲解
Jul 06 Python
django主动抛出403异常的方法详解
Jan 04 Python
浅谈Python类中的self到底是干啥的
Nov 11 Python
python第三方库学习笔记
Feb 07 Python
Tkinter中复选菜单是否被选中的判断与设置方式
Mar 04 Python
浅谈keras中loss与val_loss的关系
Jun 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/10/19 PHP
destoon各类调用汇总
2014/06/20 PHP
php实现微信公众号无限群发
2015/10/11 PHP
关于PHP文件的自动运行方法分析
2016/05/13 PHP
php redis实现对200w用户的即时推送
2017/03/04 PHP
javascript中判断一个值是否在数组中并没有直接使用
2012/12/17 Javascript
谈谈JavaScript中的函数与闭包
2013/04/14 Javascript
javascript自启动函数的问题探讨
2013/10/05 Javascript
jQuery在页面加载时动态修改图片尺寸的方法
2015/03/20 Javascript
JavaScript中数据结构与算法(四):串(BF)
2015/06/19 Javascript
深入解析JavaScript中的数字对象与字符串对象
2015/10/21 Javascript
学好js,这些js函数概念一定要知道【推荐】
2017/01/19 Javascript
AngularJS 购物车全选/取消全选功能的实现方法
2017/08/14 Javascript
jQuery响应滚动条事件功能示例
2017/10/14 jQuery
React教程之封装一个Portal可复用组件的方法
2018/01/02 Javascript
Vue调用后端java接口的实例代码
2019/10/28 Javascript
[00:17]天涯墨客一技能展示
2018/08/25 DOTA
Python基于csv模块实现读取与写入csv数据的方法
2018/01/18 Python
python爬虫面试宝典(常见问题)
2018/03/02 Python
TensorFlow实现非线性支持向量机的实现方法
2018/04/28 Python
详解Python数据可视化编程 - 词云生成并保存(jieba+WordCloud)
2019/03/26 Python
python制作简单五子棋游戏
2019/06/18 Python
在Qt中正确的设置窗体的背景图片的几种方法总结
2019/06/19 Python
浅谈PyQt5 的帮助文档查找方法,可以查看每个类的方法
2019/06/25 Python
Python facenet进行人脸识别测试过程解析
2019/08/16 Python
Python 基于jwt实现认证机制流程解析
2020/06/22 Python
python实现简单的井字棋游戏(gui界面)
2021/01/22 Python
意大利简约的休闲品牌:Aspesi
2018/02/08 全球购物
不忘国耻振兴中华演讲稿
2014/05/14 职场文书
学生自我鉴定格式及范文
2014/09/16 职场文书
党员干部对十八届四中全会的期盼
2014/10/17 职场文书
硕士毕业论文导师评语
2014/12/31 职场文书
自愿离婚协议书2015
2015/01/26 职场文书
城管年度个人总结
2015/02/28 职场文书
义卖募捐活动总结
2015/05/09 职场文书
MySQL限制查询和数据排序介绍
2022/03/25 MySQL