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. REDHAT7进入单用户模式

    Redhat7采用的是grub2,和Redhat6.x进入单用户的方法不同. 一.init方法 1.centos7的grub2界面会有两个入口,正常系统入口和救援模式: 2.修改grub2引导 在正常 ...

  2. Python3 注释和运算符

    Python3 注释 确保对模块, 函数, 方法和行内注释使用正确的风格 Python中的注释有单行注释和多行注释: Python中单行注释以 # 开头,例如:: # 这是一个注释 print(&qu ...

  3. Zabbix磁盘性能监控

    iostat统计磁盘信息的时候,使用的是/proc/diskstats ,cat /proc/diskstats显示如下 ram0 ram1 ram2 ram3 ram4 ram5 ram6 ram7 ...

  4. 理解分布式一致性:Paxos协议之Cheap Paxos & Fast Paxos

    理解分布式一致性:Paxos协议之Cheap Paxos & Fast Paxos Cheap Paxos Message flow: Cheap Multi-Paxos Fast Paxos ...

  5. Scala教程之:面向对象的scala

    文章目录 面向对象的scala Unified Types Classes Traits 面向对象的scala 我们知道Scala是一种JVM语言,可以合java无缝衔接,这也就大大的扩展了scala ...

  6. 使用BottomNavigationView+ViewPager+Fragment的底部导航栏

    2019独角兽企业重金招聘Python工程师标准>>> 使用BottomNavigationView做底部工具栏,使用ViewPager做页面切换,使用Fragment完成每个页面的 ...

  7. VUE 后台管理系统权限控制

    谈一谈VUE 后台管理系统权限控制 前端权限从本质上来讲, 就是控制视图层的展示,比如说是某个页面或者某个按钮,后端权限可以控制某个用户是否能够查询数据, 是否能够修改数据等操作,后端权限大部分是基于 ...

  8. spring源码阅读笔记10:bean生命周期

    前面的文章主要集中在分析Spring IOC容器部分的原理,这部分的核心逻辑是和bean创建及管理相关,对于单例bean的管理,从创建好到缓存起来再到销毁,其是有一个完整的生命周期,并且Spring也 ...

  9. 2020牛客寒假算法基础集训营2 J题可以回顾回顾

    2020牛客寒假算法基础集训营2 A.做游戏 这是个签到题. #include <cstdio> #include <cstdlib> #include <cstring ...

  10. java23种设计模式——泡MM版

    一.创建型模式 1.FACTORY:追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,固然口味有所不同,但不管你带MM往麦当劳或肯德基,只管向服务员说;来四个鸡翅就行了.麦当劳和肯德 ...