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 相关文章推荐
linux环境下python中MySQLdb模块的安装方法
Jun 16 Python
Python基于回溯法子集树模板解决0-1背包问题实例
Sep 02 Python
python 实现一个贴吧图片爬虫的示例
Oct 12 Python
python中的字典操作及字典函数
Jan 03 Python
python中利用zfill方法自动给数字前面补0
Apr 10 Python
Python下使用Scrapy爬取网页内容的实例
May 21 Python
python通过paramiko复制远程文件及文件目录到本地
Apr 30 Python
网易有道2017内推编程题 洗牌(python)
Jun 19 Python
python爬虫 基于requests模块的get请求实现详解
Aug 20 Python
使用Rasterio读取栅格数据的实例讲解
Nov 26 Python
pycharm 设置项目的根目录教程
Feb 12 Python
PyCharm配置KBEngine快速处理代码提示冲突、配置命令问题
Apr 03 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 Global变量定义当前页面的全局变量实现探讨
2013/06/05 PHP
PHP中读取文件的8种方法和代码实例
2014/08/05 PHP
PHP实现求解最长公共子串问题的方法
2017/11/17 PHP
让插入到 innerHTML 中的 script 跑起来的实现代码
2006/07/01 Javascript
jquery 学习之二 属性相关
2010/11/23 Javascript
鼠标滑上去后图片放大浮出效果的js代码
2011/05/28 Javascript
jquery 日期控件datepicker属性详细解析
2013/11/08 Javascript
js 实现菜单上下显示附效果图
2013/11/21 Javascript
js鼠标及对象坐标控制属性详细解析
2013/12/14 Javascript
JS数组去重与取重的示例代码
2014/01/24 Javascript
JavaScript格式化日期时间的方法和自定义格式化函数示例
2014/04/04 Javascript
AngularJS基础知识笔记之过滤器
2015/05/10 Javascript
JavaScript简单下拉菜单实例代码
2015/09/07 Javascript
浅谈node.js中async异步编程
2015/10/22 Javascript
jQuery简单获取键盘事件的方法
2016/01/22 Javascript
多种js图片预加载实现方式分享
2016/02/19 Javascript
AngularJS基础 ng-repeat 指令简单示例
2016/08/03 Javascript
Angular2的管道Pipe的使用方法
2017/11/07 Javascript
用ES6的class模仿Vue写一个双向绑定的示例代码
2018/04/20 Javascript
你不可不知的Vue.js列表渲染详解
2019/10/01 Javascript
原生JS实现拖拽功能
2020/12/16 Javascript
[01:50]《我与DAC》之玩家:iG夺冠时的那面红旗
2018/03/29 DOTA
python微信公众号开发简单流程
2018/03/23 Python
利用python库在局域网内传输文件的方法
2018/06/04 Python
python绘制热力图heatmap
2020/03/23 Python
ZABBIX3.2使用python脚本实现监控报表的方法
2019/07/02 Python
python 实现目录复制的三种小结
2019/12/04 Python
英国排名第一的在线宠物用品商店:Monster Pet Supplies
2018/05/20 全球购物
英国家庭家具、照明和花园家具购物网站:Furniture123
2018/12/31 全球购物
电气工程自动化求职信
2014/03/14 职场文书
商铺租房协议书范本
2014/12/04 职场文书
期末复习计划
2015/01/19 职场文书
大学学习委员竞选稿
2015/11/20 职场文书
承诺书的内容有哪些,怎么写?
2019/06/21 职场文书
pytest进阶教程之fixture函数详解
2021/03/29 Python
python中Matplotlib绘制直线的实例代码
2021/07/04 Python