DRF:过滤&搜索&排序功能
过滤功能利用的是第三方包 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:过滤&搜索&排序功能的更多相关文章
- YII关联字段并带搜索排序功能
1.简介 从接触yii框架到现在已经快有两个月了,但是自己对yii框架的了解程度并不是很深,并没有系统地去学习,仅仅只是在做项目的时候遇到不懂得知识才去翻手册. 在上一个项目中因为需要将关联的表的字段 ...
- drf过滤和排序及异常处理的包装
过滤和排序(4星) 查询所有才需要过滤(根据过滤条件),排序(按某个规律排序) 使用前提: 必须继承的顶层类是GenericAPIView 内置过滤类 内置过滤类使用,在视图类中配置,是模糊查询 使用 ...
- django的过滤和搜索排序功能django-filter
参考: 1.https://django-filter.readthedocs.io/en/master/guide/usage.html#the-filter 2.https://www.cnblo ...
- MixItUp:超炫!基于 CSS3 & jQuery 的过滤和排序插件
MixItUp 是一款轻量,但功能强大的 jQuery 插件,提供了对分类和有序内容的美丽的动画过滤和排序功能.特别适合用于作品集网站,画廊,图片博客以及任何的分类或有序内容. 它是如何工作的? Mi ...
- [Android分享] 【转帖】Android ListView的A-Z字母排序和过滤搜索功能
感谢eoe社区的分享 最近看关于Android实现ListView的功能问题,一直都是小伙伴们关心探讨的Android开发问题之一,今天看到有关ListView实现A-Z字母排序和过滤搜索功能 ...
- Android 实现ListView的A-Z字母排序和过滤搜索功能,实现汉字转成拼音
转载:http://blog.csdn.net/xiaanming/article/details/12684155 转载请注明出处:http://blog.csdn.net/xiaanming/ar ...
- Django(67)drf搜索过滤和排序过滤
前言 当我们需要对后台的数据进行过滤的时候,drf有两种,搜索过滤和排序过滤. 搜索过滤:比如我们想返回sex=1的,那么我们就可以从所有数据中进行筛选 排序过滤:比如我们想对价格进行升序排列,就可以 ...
- drf_jwt手动签发与校验-drf小组件:过滤-筛选-排序-分页
签发token 源码的入口:完成token签发的view类里面封装的方法. 源码中在请求token的时候只有post请求方法,主要分析一下源码中的post方法的实现. settings源码: 总结: ...
- 在 Students 的 Index 页面增加列标题链接(排序),分页,过滤和分组功能
3-1 在 Students 的 Index 页面增加列标题链接 为 Index 页面增加排序的功能,我们需要修改 Student 控制器的 Index 方法,还需要为 Student 视图增加代码 ...
随机推荐
- 循环队列 分类: c/c++ 2014-10-10 23:28 605人阅读 评论(0) 收藏
利用线性表实现队列,为了有效利用空间,将其设计为循环结构,防止假溢出:牺牲一个存储单元以区分队空.队满. 设front队头,rear队尾,N为顺序表大小 队空:rear==front 队满:(rear ...
- 随机L系统分形树 分类: 计算机图形学 2014-06-01 23:27 376人阅读 评论(0) 收藏
下面代码需要插入到MFC项目中运行,实现了计算机图形学中的L系统分形树. class Node { public: int x,y; double direction; Node(){} }; CSt ...
- iOS 集成银联支付(绕过文档的坑,快速集成)-转
本文是投稿文章,作者:南栀倾寒当初集成支付宝的时候,觉得见了这么丑的代码,加上这么难找的下载地址,在配上几乎为零的文档,寒哥就要吐血了. 下午去集成银联,才知道血吐的早了. 下载地址:https:// ...
- java IO流 复制图片
(一)使用字节流复制图片 //字节流方法 public static void copyFile()throws IOException { //1.获取目标路径 //(1)可以通过字符串 // St ...
- C#菜鸟正则表达式一
LZ菜鸟,仅整理笔记,顺带记录一下,谓之增加印象. LZ认为,没必要太纠结原理,模型, 屌丝能用就对了,剩下的事情用多了自然会去探索. 中文:正则表达式,英文:Regular ExPression, ...
- SpringBoot 2.x (4):配置文件与单元测试
SpringBoot的配置文件有默认的application.properties 还可以使用YAML 区别: application.properties示例: server.port=8090 s ...
- hihocoder offer收割编程练习赛10 C 区间价值
思路: 令v[l, r](0<= l <= r < n)表示区间[l,r]的价值,则长度为n的区间的价值最少为0,最多为n*(n-1)/2.整体对价值二分,求能满足sum{v[l, ...
- Windows下的一个Nginx 批处理命令行控制台
其实作用很简单,就是为了少输入几个字母,完成对Nginx的控制而已,同时也算是练习了一把bat批处理吧. @echo off&color e&Title Nginx 命令行控制台 cl ...
- react学习文档
转自http://www.ruanyifeng.com/blog/2015/03/react.html,阮一峰老师的博客. 最近想学习react,官方文档的例子不是那么浅显易懂,看了相关博客,觉得阮一 ...
- vb,wps,excel 分裂
Sub 分列() '以空格为分隔符,连续空格只算1个.对所选中的单元格进行处理 Dim m As Range, tmpStr As String, s As String Dim x As Integ ...