iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Django实现drf搜索过滤和排序过滤
  • 196
分享到

Django实现drf搜索过滤和排序过滤

2024-04-02 19:04:59 196人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

前言 当我们需要对后台的数据进行过滤的时候,drf有两种,搜索过滤和排序过滤。 搜索过滤:比如我们想返回sex=1的,那么我们就可以从所有数据中进行筛选 排序过滤:比如我们想对价格进

前言

当我们需要对后台的数据进行过滤的时候,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系"的数据


排序过滤

跟搜索过滤一样,只需要配置局部变量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",那么我们就会过滤出所有宝马系列的车子,并且数据的排序按照车的价格从低到高排序

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搜索过滤和排序过滤内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Django实现drf搜索过滤和排序过滤

本文链接: https://www.lsjlt.com/news/128730.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Django实现drf搜索过滤和排序过滤
    前言 当我们需要对后台的数据进行过滤的时候,drf有两种,搜索过滤和排序过滤。 搜索过滤:比如我们想返回sex=1的,那么我们就可以从所有数据中进行筛选 排序过滤:比如我们想对价格进...
    99+
    2024-04-02
  • RiSearch PHP 实现搜索结果的智能排序与过滤
    作为一个开发者,我们经常会遇到需要实现搜索功能的情况。而在实际的项目中,如何对搜索结果进行智能排序和过滤是一个非常关键的问题。本文将介绍如何使用 RiSearch PHP 来实现搜索结果的智能排序与过滤,并提供具体的代码示例。RiSearc...
    99+
    2023-10-21
    过滤 智能排序 RiSearch
  • DRF过滤排序分页异常处理的过程记录
    目录一、过滤二、排序三、分页PageNumberPaginationLimitOffsetPaginationCursorPagination继承APIView使用方法四、异常处理源...
    99+
    2024-04-02
  • SQL如何实现过滤排序
    这篇文章将为大家详细讲解有关SQL如何实现过滤排序,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。 1、where  &n...
    99+
    2024-04-02
  • Vue 列表过滤与排序的实现
    目录一、数据过滤watch实现computed 实现二、列表排序三、数据更新的一个问题四、Vue.set 方法五、Vue监视数据的原理六、综合练习一、数据过滤 watch实现 <...
    99+
    2024-04-02
  • Tree组件搜索过滤功能实现干货
    目录1 Tree 组件搜索过滤功能简介2 组件交互逻辑分析2.1 对于匹配节点的标识如何呈现?2.2 用户如何调用 tree 组件的搜索过滤功能?2.3 对于匹配的节点其父节点及兄弟...
    99+
    2024-04-02
  • Vue如何实现列表过滤与排序
    这篇文章主要讲解了“Vue如何实现列表过滤与排序”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Vue如何实现列表过滤与排序”吧!一、数据过滤watch实现<!DOCTYPE ...
    99+
    2023-06-30
  • Vue2使用cube-ui实现搜索过滤、高亮功能
    目录前言一、需求流程:功能实现总结介绍 cube-ui 是基于 Vue.js 实现的精致移动端组件库。 特性 质量可靠由滴滴内部组件库精简提炼而来,经历了业务一年多的考验,...
    99+
    2023-01-07
    vue搜索过滤高亮 vue搜索过滤
  • 如何在 ASP 中使用 JavaScript 数组实现实时搜索和过滤?
    ASP 是一种广泛使用的 Web 应用程序框架,而 JavaScript 数组则是在 Web 开发中十分常用的数据结构之一。在本文中,我们将讨论如何在 ASP 中使用 JavaScript 数组来实现实时搜索和过滤功能,以提高 Web 应用...
    99+
    2023-07-22
    实时 javascript 数组
  • springboot结合redis实现搜索栏热搜功能及文字过滤
    使用java和redis实现一个简单的热搜功能,具备以下功能: 1:搜索栏展示当前登陆的个人用户的搜索历史记录,删除个人历史记录 2:用户在搜索栏输入某字符,则将该字符记录下来 以z...
    99+
    2024-04-02
  • Django模板中怎么实现过滤器
    这篇文章主要介绍了Django模板中怎么实现过滤器,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。模版常用过滤器在模版中,有时候需要对一些数据进行处理以后才能使用。一般在Pyt...
    99+
    2023-06-15
  • Django 模板中常用的过滤器实现
    模版常用过滤器 在模版中,有时候需要对一些数据进行处理以后才能使用。一般在Python中我们是通过函数的形式来完成的。而在模版中,则是通过过滤器来实现的。过滤器使用的是|来使用。 ...
    99+
    2024-04-02
  • pycharm如何在搜索时过滤测试文件
    小编给大家分享一下pycharm如何在搜索时过滤测试文件,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!搜索时过滤测试文件我平时会...
    99+
    2024-04-02
  • SpringBoot 热搜与不雅文字过滤的实现
    目录一、前言二、不雅文字过滤1、实现原理2、实现方法2.1 敏感词库初始化2.2 敏感词过滤器2.3 测试使用三、Redis搜索栏热搜1、前言2、代码实现参考文章一、前言 这里主要讲...
    99+
    2024-04-02
  • SpringBoot过滤器实现项目内接口过滤详解
    目录业务需要处理的问题公众号用户信息与业务系统做绑定将路由中心的接口与业务系统的接口判断处理步骤全部代码代理转发实现业务 由于业务需求,存在两套项目,一套是路由中心,一套是业务系统....
    99+
    2023-05-16
    SpringBoot实现项目接口过滤 SpringBoot项目接口过滤 SpringBoot过滤器
  • 如何使用Vue的过滤器功能来实现模糊搜索
    Vue.js是一款流行的JavaScript框架之一,它提供了许多有用的功能,包括Vue的过滤器。在本文中,我们将介绍如何使用Vue的过滤器功能来实现模糊搜索。在Vue.js中,过滤器是用于转换文本的函数,常常用于格式化文本输出。在本例中,...
    99+
    2023-05-14
  • Sphinx PHP 实现邮件系统的全文搜索与过滤功能
    随着电子邮件的广泛应用,人们越来越关注快速检索与过滤邮件的效率。Sphinx是一款开源的全文搜索引擎,其高效的搜索速度与强大的过滤功能使其成为邮件系统的理想选择。本文将介绍如何使用Sphinx PHP实现邮件系统的全文搜索与过滤功能,并给出...
    99+
    2023-10-21
    邮件系统 - 指涉包括发送
  • Vue中如何实现列表渲染,排序,过滤操作
    这篇文章主要为大家展示了“Vue中如何实现列表渲染,排序,过滤操作”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Vue中如何实现列表渲染,排序,过滤操作”这篇文章吧。1. 列表(渲染、排序、过滤...
    99+
    2023-06-29
  • Vue如何实现数组更新及过滤排序功能
    这篇文章给大家分享的是有关Vue如何实现数组更新及过滤排序功能的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。变异方法  Vue 包含一组观察数组的变异方法,它们将会触发视图更新,...
    99+
    2024-04-02
  • RiSearch PHP 与协同过滤算法结合实现个性化搜索
    引言:随着互联网的飞速发展,人们对搜索引擎的需求也日益增长。传统的搜索引擎往往只能根据用户提供的关键词进行搜索,无法真正地根据用户的兴趣和偏好来个性化推荐结果。为了解决这个问题,我们可以将RiSearch PHP与协同过滤算法结合起来,实现...
    99+
    2023-10-21
    个性化搜索 RiSearch PHP 协同过滤算法
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作