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 相关文章推荐
Android 兼容性问题:java.lang.UnsupportedOperationException解决办法
Mar 19 Python
numpy自动生成数组详解
Dec 15 Python
Python eval的常见错误封装及利用原理详解
Mar 26 Python
Python3.6+Django2.0以上 xadmin站点的配置和使用教程图解
Jun 04 Python
Python自动抢红包教程详解
Jun 11 Python
python如何实现数据的线性拟合
Jul 19 Python
详解Python中正则匹配TAB及空格的小技巧
Jul 26 Python
django 实现手动存储文件到model的FileField
Mar 30 Python
利用jupyter网页版本进行python函数查询方式
Apr 14 Python
利用Python实现自动扫雷小脚本
Dec 17 Python
使用python对excel表格处理的一些小功能
Jan 25 Python
使用Python webdriver图书馆抢座自动预约的正确方法
Mar 04 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程序的多种方法介绍
2014/11/06 PHP
jquery代码实现多选、不同分享功能
2015/07/31 Javascript
JS+CSS实现大气的黑色首页导航菜单效果代码
2015/09/10 Javascript
JavaScript判断表单为空及获取焦点的方法
2016/02/12 Javascript
three.js实现围绕某物体旋转
2017/01/25 Javascript
webpack+vue中使用别名路径引用静态图片地址
2017/11/20 Javascript
使用vue-cli(vue脚手架)快速搭建项目的方法
2018/05/21 Javascript
小程序图片剪裁加旋转的示例代码
2018/07/10 Javascript
Puppeteer环境搭建的详细步骤
2018/09/21 Javascript
Javascript数组方法reduce的妙用之处分享
2019/06/10 Javascript
JS常见错误(Error)及处理方案详解
2020/07/02 Javascript
详解JavaScript 中的批处理和缓存
2020/11/19 Javascript
[42:04]DOTA2上海特级锦标赛主赛事日 - 2 胜者组第一轮#3Secret VS OG第一局
2016/03/03 DOTA
Flask的图形化管理界面搭建框架Flask-Admin的使用教程
2016/06/13 Python
Python深度优先算法生成迷宫
2018/01/22 Python
python3 破解 geetest(极验)的滑块验证码功能
2018/02/24 Python
浅谈python 导入模块和解决文件句柄找不到问题
2018/12/15 Python
django实现用户注册实例讲解
2019/10/30 Python
python3.7+selenium模拟淘宝登录功能的实现
2020/05/26 Python
python 实现关联规则算法Apriori的示例
2020/09/30 Python
Python用access判断文件是否被占用的实例方法
2020/12/17 Python
HTML5本地存储之Database Storage应用介绍
2013/01/06 HTML / CSS
Forever 21美国官网:美国标志性快时尚品牌
2017/02/20 全球购物
瑞典廉价机票预订网站:Seat24
2018/06/19 全球购物
英国最大的自有市场,比亚马逊便宜:Flubit
2019/03/19 全球购物
Hotels.com泰国:酒店预订网站
2019/11/20 全球购物
主管会计岗位责任制
2014/02/10 职场文书
纪念九一八爱国演讲稿600字
2014/09/14 职场文书
五年级下册复习计划
2015/01/19 职场文书
国庆庆典邀请函
2015/02/02 职场文书
安全教育的主题班会
2015/08/13 职场文书
社交电商模式的兴起:这些新的商机千万别错过
2019/07/26 职场文书
导游词之舟山普陀山
2019/11/06 职场文书
详细分析PHP7与PHP5区别
2021/06/26 PHP
MYSQL 表的全面总结
2021/11/11 MySQL
SONY600GR,国产收音机厂商永远的痛
2022/04/05 无线电