过滤功能利用的是第三方包 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-filters 文档: https://django-filter.readthedocs.io/en/latest/guide/rest_framework.html

DRF:过滤&搜索&排序功能的更多相关文章

  1. YII关联字段并带搜索排序功能

    1.简介 从接触yii框架到现在已经快有两个月了,但是自己对yii框架的了解程度并不是很深,并没有系统地去学习,仅仅只是在做项目的时候遇到不懂得知识才去翻手册. 在上一个项目中因为需要将关联的表的字段 ...

  2. drf过滤和排序及异常处理的包装

    过滤和排序(4星) 查询所有才需要过滤(根据过滤条件),排序(按某个规律排序) 使用前提: 必须继承的顶层类是GenericAPIView 内置过滤类 内置过滤类使用,在视图类中配置,是模糊查询 使用 ...

  3. django的过滤和搜索排序功能django-filter

    参考: 1.https://django-filter.readthedocs.io/en/master/guide/usage.html#the-filter 2.https://www.cnblo ...

  4. MixItUp:超炫!基于 CSS3 & jQuery 的过滤和排序插件

    MixItUp 是一款轻量,但功能强大的 jQuery 插件,提供了对分类和有序内容的美丽的动画过滤和排序功能.特别适合用于作品集网站,画廊,图片博客以及任何的分类或有序内容. 它是如何工作的? Mi ...

  5. [Android分享] 【转帖】Android ListView的A-Z字母排序和过滤搜索功能

      感谢eoe社区的分享   最近看关于Android实现ListView的功能问题,一直都是小伙伴们关心探讨的Android开发问题之一,今天看到有关ListView实现A-Z字母排序和过滤搜索功能 ...

  6. Android 实现ListView的A-Z字母排序和过滤搜索功能,实现汉字转成拼音

    转载:http://blog.csdn.net/xiaanming/article/details/12684155 转载请注明出处:http://blog.csdn.net/xiaanming/ar ...

  7. Django(67)drf搜索过滤和排序过滤

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

  8. drf_jwt手动签发与校验-drf小组件:过滤-筛选-排序-分页

    签发token 源码的入口:完成token签发的view类里面封装的方法. 源码中在请求token的时候只有post请求方法,主要分析一下源码中的post方法的实现. settings源码: 总结: ...

  9. 在 Students 的 Index 页面增加列标题链接(排序),分页,过滤和分组功能

    3-1  在 Students 的 Index 页面增加列标题链接 为 Index 页面增加排序的功能,我们需要修改 Student 控制器的 Index 方法,还需要为 Student 视图增加代码 ...

随机推荐

  1. [C#基础知识系列]专题十:全面解析可空类型[转]

    原文链接 主要内容: 1:空合并操作符(?? 操作符) ??操作符也就是"空合并操作符",它代表的意思是两个操作数,如果左边的数不为null时,就返回左边的数,如果左边的数为nul ...

  2. Spring日期格式初始化

    原文链接地址 一.初始化参数绑定[一种日期格式] 配置步骤: ①:在applicationcontext.xml中只需要配置一个包扫描器即可 1 2 <!-- 包扫描器 -->       ...

  3. js中,浏览器中不同元素位置属性解析

    offset()   只对可见元素有效,获取匹配元素在当前视口的相对偏移,返回的对象有两个整型属性,top和left,像素计算: position() 相对父元素的偏移,position.left   ...

  4. Elasticsearch--集群&吞吐量

    目录 高查询和高吞吐量 过滤器缓存 字段数据缓存和断路器 断路器 存储模块 索引缓冲和刷新率 索引刷新率 线程池的配置 一些通用的建议来配置高索引和查询吞吐量的集群 高查询和高吞吐量 过滤器缓存 过滤 ...

  5. CSS定位内容

    div.h1 或 p 元素常常被称为块级元素.这意味着这些元素显示为    一块内容,即“块框”.与之相反,span 和 strong 等元素称为“行    内元素”,这是因为它们的内容显示在行中,即 ...

  6. 波哥!一个不安分的IT男

    第一篇博文,紧张,窃喜,辣眼睛! 这个订阅号主要是写给自己的,近期越来越发现记忆力不如以前了! 时光如梭,岁月荏苒,或许这两句经典的开头文比较契合自己的年纪.依稀记得几年前还在组装服务器.搬机柜.做系 ...

  7. R in action读书笔记(5)-第七章:基本统计分析

    7.1描述性统计分析 > vars<-c("mpg","hp","wt") > head(mtcars[vars])    ...

  8. NOT IN、NOT EXISTS的相关子查询改用LEFT JOIN--sql2000性能优化

    参考文章:SQL SERVER性能优化综述(很好的总结,不要错过哦) 数据库:系统数据库 子查询的用法 子查询是一个 SELECT 查询,它嵌套在 SELECT.INSERT.UPDATE.DELET ...

  9. SQL转Java代码小工具

    工作中使用SQL的时候很多,当使用hibernate的时候,经常遇到多行的SQL,通常在PL/SQL或其他地方写好SQL,测试没问题后,需要将SQL写到程序代码中,多行SQL需要拼接字符串,手动一行行 ...

  10. SQL——连接查询、聚合函数、开窗函数、分组功能、联合查询、子查询

    连接查询 inner join,用的最多,表示多张表一一对应 聚合函数 操作行数据,进行合并 sum.avg.count.max.min 开窗函数 将合并的数据分布到原表的每一行,相当于多出来了一列, ...