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在校内发人人网状态(人人网看状态)
Feb 19 Python
跟老齐学Python之总结参数的传递
Oct 10 Python
python简单获取本机计算机名和IP地址的方法
Jun 03 Python
Python 12306抢火车票脚本 Python京东抢手机脚本
Feb 06 Python
python opencv 直方图反向投影的方法
Feb 24 Python
Python统计单词出现的次数
Apr 04 Python
python实践项目之监控当前联网状态详情
May 23 Python
pytorch 改变tensor尺寸的实现
Jan 03 Python
python实现梯度下降法
Mar 24 Python
Python基于os.environ从windows获取环境变量
Jun 09 Python
python 逆向爬虫正确调用 JAR 加密逻辑
Jan 12 Python
Python爬取科目四考试题库的方法实现
Mar 30 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
基于laravel制作APP接口(API)
2016/03/15 PHP
利用PHP获取网站访客的所在地位置
2017/01/18 PHP
jQuery移动和复制dom节点实用DOM操作案例
2012/12/17 Javascript
extjs3 combobox取value和text案例详解
2013/02/06 Javascript
js和php如何获取当前url的内容
2013/09/22 Javascript
JavaScript中读取和保存文件实例
2014/05/08 Javascript
jquery mobile页面跳转后样式丢失js失效的解决方法
2014/09/06 Javascript
浏览器缩放检测的js代码
2014/09/28 Javascript
浅谈javascript 函数属性和方法
2015/01/21 Javascript
Javascript中setTimeOut和setInterval的定时器用法
2015/06/12 Javascript
jQuery实现微信长按识别二维码功能
2016/08/26 Javascript
分类解析jQuery选择器
2016/11/23 Javascript
javascript实现右下角广告框效果
2017/02/01 Javascript
three.js实现3D视野缩放效果
2017/11/16 Javascript
nodejs发送http请求时遇到404长时间未响应的解决方法
2017/12/10 NodeJs
JavaScript中发出HTTP请求最常用的方法
2018/07/12 Javascript
JavaScript实现省份城市的三级联动
2020/02/11 Javascript
react基本安装与测试示例
2020/04/27 Javascript
[03:18]DOTA2亚洲邀请赛小组赛第一日 RECAP赛事回顾
2015/01/30 DOTA
python自动化工具日志查询分析脚本代码实现
2013/11/26 Python
python使用mysql的两种使用方式
2018/03/07 Python
解决pip install的时候报错timed out的问题
2018/06/12 Python
python GUI库图形界面开发之PyQt5布局控件QVBoxLayout详细使用方法与实例
2020/03/06 Python
在jupyter notebook中调用.ipynb文件方式
2020/04/14 Python
HTML5之SVG 2D入门5—颜色的表示及定义方式
2013/01/30 HTML / CSS
浅谈html5与APP混合开发遇到的问题总结
2018/03/20 HTML / CSS
java程序员面试交流
2012/11/29 面试题
《草虫的村落》教学反思
2014/02/16 职场文书
幼儿园元旦家长感言
2014/02/27 职场文书
产品质量承诺书
2014/03/27 职场文书
2015年爱牙日活动总结
2015/02/05 职场文书
青年志愿者活动感想
2015/08/07 职场文书
《风筝》教学反思
2016/02/23 职场文书
编写python程序的90条建议
2021/04/14 Python
简单聊一聊SQL注入及防止SQL注入
2022/03/23 MySQL
分享一个vue实现的记事本功能案例
2022/04/11 Vue.js