django-filter

https://github.com/carltongibson/django-filter

https://django-filter.readthedocs.io/en/master/guide/rest_framework.html

https://django-filter.readthedocs.io/en/master/ref/filters.html

https://github.com/carltongibson/django-filter

pip install django-filter

INSTALLED_APPS = [
...
'django_filters',
] 'DEFAULT_FILTER_BACKENDS': (
'django_filters.rest_framework.DjangoFilterBackend', # 过滤功能
'rest_framework.filters.SearchFilter', # 搜索功能
'rest_framework.filters.OrderingFilter', # 排序功能
),
全局设置默认搜索,在需要搜索的地方加上对应的字段元组即可filter_fields = ('字段1','字段2')
    queryset = Idc.objects.all()
serializer_class = IdcSerializer
# filter_backends = (DjangoFilterBackend,)
filter_fields = ('name','letter')

一. 视图函数指定搜索 - 最简精确搜索配置方法
from django_filters import rest_framework as filters

class ProductFilter(filters.FilterSet):
... from django_filters import rest_framework as filters class ProductList(generics.ListAPIView):
queryset = Product.objects.all()
serializer_class = ProductSerializer
filter_backends = (filters.DjangoFilterBackend,)
filterset_fields = ('category', 'in_stock')

二. 自定义搜索 - 精确搜索配置方法

  • 1.定义一个 filter.py 文件
from django_filters import rest_framework as filters
from idcs.models import Idc
from django.db.models import Q class IdcFilter(filters.FilterSet):
class Meta:
model = Idc
fields = ['name','letter']
  • 2.在视图函数应用
    queryset = Idc.objects.all()
serializer_class = IdcSerializer
# filter_backends = (DjangoFilterBackend,)
# filter_fields = ('name','letter')
filter_class = IdcFilter

三. 自定义搜索 - 单字段模糊搜索

from django_filters import rest_framework as filters
from idcs.models import Idc
from django.db.models import Q class IdcFilter(filters.FilterSet):
name = filters.CharFilter(field_name="name", lookup_expr='icontains') class Meta:
model = Idc
fields = ['name','letter']

四. 自定义搜索 - 多个字段模糊搜索 方法搜索

变量是前端传过来搜索的 key

from django_filters import rest_framework as filters
from idcs.models import Idc
from django.db.models import Q class IdcFilter(filters.FilterSet):
name = filters.CharFilter(field_name="name", lookup_expr='icontains')
contact = filters.CharFilter(method='by_contact') def by_contact(self, queryset, name, value):
# name 是要搜索的key value是搜索的value
return queryset.filter(Q(phone__icontains=value)|Q(email__icontains=value)) class Meta:
model = Idc
fields = ['name','letter','contact']

总结

  • 1.在 settings 设置全局视图搜索配置
    'DEFAULT_FILTER_BACKENDS': (
'django_filters.rest_framework.DjangoFilterBackend', # 过滤功能
'rest_framework.filters.SearchFilter', # 搜索功能
'rest_framework.filters.OrderingFilter', # 排序功能
),
  • 2.每个视图里面指定精确搜索字段
filter_fields = ('name','letter')
  • 3.模糊搜索使用自定义搜索
ORM
operators = {
'exact': '= %s',
'iexact': 'LIKE %s',
'contains': 'LIKE BINARY %s',
'icontains': 'LIKE %s',
'regex': 'REGEXP BINARY %s',
'iregex': 'REGEXP %s',
'gt': '> %s',
'gte': '>= %s',
'lt': '< %s',
'lte': '<= %s',
'startswith': 'LIKE BINARY %s',
'endswith': 'LIKE BINARY %s',
'istartswith': 'LIKE %s',
'iendswith': 'LIKE %s',
}

search 与 ordering

  • serchar 前端传回来的关键字是 search,重写 SEARCH_PARAM 覆盖
  • ordering 前端传回来的关键字是 ordering,重写 ORDERING_PARAM 覆
from rest_framework import filters

    filter_backends = (DjangoFilterBackend, filters.SearchFilter, filters.OrderingFilter)
filter_class = GoodsFilter
search_fields = ('name', 'goods_brief', 'goods_desc')
ordering_fields = ('sold_num', 'shop_price')
'^' :以xx字符串开始搜索
'=' :完全匹配
'@' :全文搜索(目前只支持Django的MySQL后端)
'$' :正则表达式搜索

原始的搜索方法

from rest_framework import generics
class ArticleViewSet(generics.ListAPIView):
queryset = Article.objects.all() # 查询结果集
serializer_class = ArticleSerializer # 序列化类
pagination_class = ArticlePagination # 自定义分页会覆盖settings全局配置的 def get_queryset(self):
queryset = Article.objects.all()
read_num = self.request.query_params.get('read_num', 0) # 获取查询字段值
if read_num:
queryset = queryset.filter(read_num__gt=int(read_num)) return queryset

05.django 搜索与过滤的更多相关文章

  1. iView学习笔记(三):表格搜索,过滤及隐藏列操作

    iView学习笔记(三):表格搜索,过滤及隐藏某列操作 1.后端准备工作 环境说明 python版本:3.6.6 Django版本:1.11.8 数据库:MariaDB 5.5.60 新建Django ...

  2. ionic,angularJs实现搜索框过滤关键字

    利用AngularJS自带的过滤器,我们可以很方便的实现搜索框过滤的效果,但是怎么实现类似百度搜索过滤列表中关键字变色的效果呢? 页面上代码: <input type="text&qu ...

  3. 使用Tampermonkey(油猴) 插件,重新实现了,百度搜索热点过滤功能

    昨天晚上,花了点时间学习了Chrome插件的制作方法,并书写了<Chrome 百度搜索热点过滤插件 - 开源软件>这一文章,简单地介绍自己实现的百度搜索热点过滤神器的原理和使用方式,并进行 ...

  4. Chrome 百度搜索热点过滤插件 - 开源软件

    学习时,为了搜集最全的中文资料,有时候不得不使用Baidu搜索引擎.在你还是个小菜鸡的时候你可能会花费大量时间在百度上! 但是,时间久了你会发现,你总会被网络上一些奇奇怪怪或者有趣的事情吸引过去而逐渐 ...

  5. 〈三〉ElasticSearch的认识:搜索、过滤、排序

    目录 上节回顾 本节前言 文档的搜索 URL参数条件搜索 请求体条件搜索 语法与示例: 补充: 小节总结: 文档的过滤filter 语法与举例: filter与bool constant_score ...

  6. 解决-Django使用filter过滤时间,无法获取月份的问题

    django中的filter日期查询属性有:year.month.day.week_day.hour.minute.second 但是但我在使用过滤查询是却总是无法过滤出月份,各种查资料,最后才发现是 ...

  7. Django之extra过滤

    extra extra(select=None, where=None, params=None, tables=None, order_by=None, select_params=None) 有些 ...

  8. 函数stripslashes去除转义 shopnc 搜索框过滤特殊字符 输入单斜杆会自动转义

    如何php是如何处理和过滤特殊字符的呢? 搜索%_显示所有商品:搜索\会在搜索框内叠加\\ 查了一下 magic_quotes_sybase 项开启,反斜线将被去除,但是两个反斜线将会被替换成一个. ...

  9. 教你编写百度搜索广告过滤的chrome插件

    1 前言 目前百度搜索列表首页里,广告5条正常内容是10条,而且广告都是前1到5条的位置,与正常内容的显示样式无异.对于我们这样有能力的开发者,其实可以简单的实现一个chrome插件,在百度搜索页面里 ...

随机推荐

  1. http请求返回的数字代表的含义

    一些常见的状态码为: 200 - 服务器成功返回网页 404 - 请求的网页不存在 503 - 服务器超时 下面提供 HTTP 状态码的完整列表.点击链接可了解详情.您也可以访问 HTTP 状态码上的 ...

  2. http 之 CORS简介

    什么是CORS? CORS:跨域资源共享.是一种机制. 用处? 它使用额外的 HTTP 头来告诉浏览器  让运行在一个 origin (domain) 上的Web应用被准许访问来自不同源服务器上的指定 ...

  3. java 之 构造器 static关键字

    构造器  特点: 方法名和类名一至,没有void没有返回,无参数的称为无参构造器,有参数的称为有参构造器 语法: public 类名 {数据类型 参数名} 目的:创建对象 注意:如果类中没有带有参数的 ...

  4. mysql之浅谈主外键

    主键(PRIMARY KEY) 主键在一个数据表中只能有唯一的一个,约束当前字段的值不能重复,且非空保证数据的完整性,也可以当做当前数据表的标识符用来查询(当做索引,唯一性索引的一种) 创建带主键的表 ...

  5. CCS进阶——div的宽度和高度是由什么决定的?

    核心知识 文档流/普通流(Normal Flow) 内联元素的宽高(高度是由行高决定的,宽度=内容+border+marging+padding) 块级元素的宽高(高度是内部文档流元素的高度总和,宽度 ...

  6. python- 函数高级

    函数高级 一.默认参数 1.默认参数概念 默认参数指函数/方法在定义时为形参赋值,对应的形参称为默认参数. 默认参数是一个参数定义期的概念,与调用无关. 2.默认参数的作用 如果参数定义默认参数,在调 ...

  7. MySQL5.7中InnoDB不可不知的新特性

    讲师介绍  赖铮 Oracle InnoDB团队 Principle Software Developer 曾任达梦.Teradata高级工程师,主要负责研发数据库执行引擎和存储引擎,十年以商数据库内 ...

  8. mybatis源码学习(三):MappedStatement的解析过程

    我们之前介绍过MappedStatement表示的是XML中的一个SQL.类当中的很多字段都是SQL中对应的属性.我们先来了解一下这个类的属性: public final class MappedSt ...

  9. #Week2 Linear Regression with One Variable

    一.Model Representation 还是以房价预测为例,一图胜千言: h表示一个从x到y的函数映射. 二.Cost Function 因为是单变量线性回归,所以假设函数是: \[h_{\th ...

  10. VScode像Codeblocks一样,不启动调试和Debug直接运行

    要是配置C++ 编译环境,这边走 用了VScode童鞋,都知道,写C++是不保留窗口的,除非打上断点或者: system("pause"); 这里给大家分享一种不需要,F5或者Ct ...