前言

  如果需要满足前端各种筛选条件查询,我们使用drf自带的会比较麻烦,比如查询书名中包含“国”字,日期大于“2020-1-1”等等诸如此类的请求,Django-filter这个组件就是要解决这样的问题。

1.安装

Django-filter支持的Python版本和Django版本、DRF版本如下:

  • Python: 3.5, 3.6, 3.7, 3.8
  • Django: 1.11, 2.0, 2.1, 2.2, 3.0
  • DRF: 3.10+

在虚拟环境中安装

pip3 install django-filter

Djangosettings.py文件中安装并配置django_filters应用:

INSTALLED_APPS = [
...
'django_filters',
] REST_FRAMEWORK = {
# 过滤器默认后端
'DEFAULT_FILTER_BACKENDS': (
'django_filters.rest_framework.DjangoFilterBackend',),
}

2.使用流程

我们通过一个简单的图书查询来说明如果在DRF中使用Django-filter过滤器。图书模型如下:

# models.py
class BookInfo(models.Model):
title = models.CharField(max_length=200,verbose_name='标题')
pub_date = models.DateField(blank=True, null=True,verbose_name='出版日期')
read = models.IntegerField(null=True,verbose_name='阅读数量')
comment = models.IntegerField(null=True,verbose_name='评论数量')
image = models.CharField(max_length=200, blank=True, null=True,verbose_name='图片') class Meta:
db_table = 'bookInfo'
verbose_name = "图书"

序列化类:

# serializers.py
class BookSerializer(serializers.ModelSerializer):
class Meta:
model = BookInfo
fields = '__all__'

自定义过滤器类:

# filters.py
from django_filters import rest_framework as filters
from . models import BookInfo
class BookFilter(filters.FilterSet):
min_read = filters.NumberFilter(field_name="read", lookup_expr='gte')
max_read = filters.NumberFilter(field_name="read", lookup_expr='lte') class Meta:
model = BookInfo
fields = ['read']

在视图中

# views.py
class BookView(ListAPIView):
queryset = BookInfo.objects.all()
serializer_class = BookSerializer
filter_class = BookFilter

url配置中

app_name = "api"

urlpatterns = [
path('books/', views.BookView.as_view()),
]

现在我们想筛选阅读数为500-1000的图书,测试结果如下

详解过滤器类

  过滤器类和Django中表单类极其类似,写法基本一样,目的是指明过滤的时候使用哪些字段进行过滤,每个字段可以使用哪些运算。运算符的写法基本参照DjangoORM中查询的写法,比如:大于等于,小于等于用"gte""lte"等等

可以通过模型快速构建过滤器类

from django_filters import rest_framework as filters
class BookFilter(filters.FilterSet):
class Meta:
model = BookInfo # 模型名
fields = ['title','comment'] # 可以使用的过滤字段

Meta中出现的fields是指过滤条件中可以出现的字段,默认是精确判断相等,查询的时候可以这样用:

http://127.0.0.1:8000/api/books/?comment=20&title=

以上代表查询的是评论条数为20条的书本

如果不是判断相等,可以自定义过滤字段进行过滤:

  • 过滤器中常用的字段类型,这些类型要输模型中对应字段类型兼容
CharFilter         字符串类型
BooleanFilter 布尔类型
DateTimeFilter 日期时间类型
DateFilter 日期类型
DateRangeFilter 日期范围
TimeFilter 时间类型
NumberFilter 数值类型,对应模型中IntegerField, FloatField, DecimalField
  • 过滤字段参数说明:
field_name: 过滤字段名,一般应该对应模型中字段名
lookup_expr: 查询时所要进行的操作,和ORM中运算符一致
  • Meta字段说明
model: 引用的模型,不是字符串
fields:指明过滤字段,可以是列表,列表中字典可以过滤,默认是判断相等;也可以字典,字典可以自定义操作
exclude = ['password'] 排除字段,不允许使用列表中字典进行过滤

自定义过滤字段:

class BookFilter(filters.FilterSet):
title = filters.CharFilter(field_name='title',lookup_expr='icontains') # 标题中包含
pub_year = filters.CharFilter(field_name='pub_date',lookup_expr='year') # 过滤年份相等
pub_year__gt = filters.CharFilter(field_name='pub_date',lookup_expr='year__gt') # 过滤大于年份
read__gt = filters.NumberFilter(field_name='read',lookup_expr="gt") # 最大阅读数
read__lt = filters.NumberFilter(field_name='read',lookup_expr="lt") # 最小阅读数 class Meta:
model = BookInfo
fields = ['title','read','comment']

自定义字段名可以和模型中不一致,但一定要用参数field_name指明对应模型中的字段名

日期查询

定义按年查询

pub_year = filters.CharFilter(field_name='pub_date',lookup_expr='year')

年份应该大于某值

pub_year__gt = filters.CharFilter(field_name='pub_date',lookup_expr='year__gt')

年份应该小于某值

read__lt = filters.NumberFilter(field_name='read',lookup_expr="lt")

查询出版年份大于2019年的书本

http://127.0.0.1:8000/api/books/?title=&read=&comment=&pub_year=&pub_year__gt=2019&read__gt=&read__lt=

查询结果:

[
{
"id": 1,
"title": "钢铁是怎样练成的",
"pub_date": "2020-10-09",
"read": 100,
"comment": 3,
"image": null
}
]

标题查询

title查询的时候可以进行包含查询,icontainsORM中表示不区分大小的包含

title = filters.CharFilter(field_name='btitle',lookup_expr='icontains')

查询标题中包含三国演义的书籍

http://127.0.0.1:8000/api/books/?title=%E4%B8%89%E5%9B%BD%E6%BC%94%E4%B9%89&read=&comment=&pub_year=&pub_year__gt=&read__gt=&read__lt=

查询结果:

[
{
"id": 2,
"title": "三国演义",
"pub_date": "2019-11-12",
"read": 200,
"comment": 20,
"image": null
}
]

阅读数查询

阅读数大于

read__gt = filters.NumberFilter(field_name='read',lookup_expr="gt")

阅读数小于

read__lt = filters.NumberFilter(field_name='read',lookup_expr="lt")

查询阅读数在100-300之间的书籍

http://127.0.0.1:8000/api/books/?title=&read=&comment=&pub_year=&pub_year__gt=&read__gt=100&read__lt=300

查询结果:

[
{
"id": 2,
"title": "三国演义",
"pub_date": "2019-11-12",
"read": 200,
"comment": 20,
"image": null
}
]

官方文档:https://django-filter.readthedocs.io/en/stable/guide/install.html

Django(69)最好用的过滤器插件Django-filter的更多相关文章

  1. Django学习(九)---Templates过滤器及Django shell和Admin增强

    一.Templates过滤器 过滤器属于django模板语言 修改模板中的变量,从而显示不同内容 {{ value | filter }} 举例:{{ list_nums | length}}    ...

  2. day056-58 django多表增加和查询基于对象和基于双下划线的多表查询聚合 分组查询 自定义标签过滤器 外部调用django环境 事务和锁

    一.多表的创建 from django.db import models # Create your models here. class Author(models.Model): id = mod ...

  3. django基础 -- 4. 模板语言 过滤器 模板继承 FBV 和CBV 装饰器 组件

    一.语法 两种特殊符号(语法): {{ }}和 {% %} 变量相关的用{{}},逻辑相关的用{%%}. 二.变量 1. 可直接用  {{ 变量名 }} (可调用字符串, 数字 ,列表,字典,对象等) ...

  4. django模板中的自定义过滤器

    (1)在APP下创建templatetags文件夹,与Models.py.views.py等同级,templatetags文件夹下添加__init__.py文件,可为空,再添加一个模块文件,例如cpt ...

  5. django下载excel,使用django-excel插件

    django下载Excel,使用django-excel插件 由于目前的资料多是使用pandas或xlwt库实现的.其实没有那么的麻烦,因为django有相对应的插件django-excel. 该插件 ...

  6. python 之 Django框架(模板系统、过滤器、simple_tag、inclusion_tag、Tags、母版、组件)

    12.35 Django模板系统 {{ }}和 {% %},变量相关的用{{}},逻辑相关的用{%%} app02/views: # 模板语言测试函数 def template_test(reques ...

  7. Django框架10 /sweetalert插件、django事务和锁、中间件、django请求生命周期

    Django框架10 /sweetalert插件.django事务和锁.中间件.django请求生命周期 目录 Django框架10 /sweetalert插件.django事务和锁.中间件.djan ...

  8. Django学习系列之captcha 验证码插件

    安装部署 安装captcha pip3. install django-simple-captcha== settings.py中引入captcha INSTALLED_APPS = [ 'djang ...

  9. 学习django就看这本书了!django book 2.0中文版

    所属网站分类: 资源下载 > python电子书 作者:熊猫烧香 链接:http://www.pythonheidong.com/blog/article/29/ 来源:python黑洞网 dj ...

  10. Django 资源 与 知识 Django中自建脚本并使用Django环境 model中的save()方法说明 filter()用法

    Django 资源 与 知识 Django中自建脚本并使用Django环境 model中的save()方法说明 filter()用法 2018/11/06 Chenxin 资料说明 Django基础入 ...

随机推荐

  1. 痞子衡嵌入式:恩智浦i.MX RTxxx系列MCU启动那些事(6.B)- FlexSPI NOR连接方式大全(RT500)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦i.MX RT500的FlexSPI NOR启动的连接方式. 这个i.MXRT FlexSPI NOR启动连接方式系列文章,痞子衡 ...

  2. 依赖倒置原则(Dependence Inversion Principle)

    目录 背景 说明 例子 "倒置"的解释 总结 参考资料 背景 这几天组内的人一起学习DDD,里面再次提到了依赖倒置原则,在这学习过程中,大家又讨论了一下依赖倒置原则. 说明 采用依 ...

  3. C++逆向分析----多重继承和菱形继承

    多重继承 多重继承是指C++类同时继承两个类或两个以上的类. class Test { public: int num1; Test() { num1 = 1; } virtual void Proc ...

  4. 对spring创建对象时为何要使用接口

    对spring创建对象时为何要使用接口,而使用接口的实现类会报错 接上一篇问题的解答:Spring AOP获取不了增强类(额外方法)和无法通过getBean()获取对象 此问题发生在动态代理时,比如对 ...

  5. [刷题] 17 Letter Combinations of a Phone Number

    要求 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合 1 不对应任何字母    示例 输入:"23" 输出:["ad", "ae&q ...

  6. python上下文管理协议,即with的详细使用

    一.with obj as f: #代码块... 二.执行流程: 1.with obj --->触发obj.__enter__(),需要在obj里写__enter__(self),在它里边写返回 ...

  7. VMware虚拟机性能优化

    一.ESX及vCenter服务器的优化 检查ESX物理服务器是否在兼容列表中,特别是BIOS的版本是否符合ESX版本的要求 开启ESX物理服务器硬件虚拟化技术VT-X,AMD-V 关闭BIOS中的英特 ...

  8. 11.20 yum:自动化RPM包管理工具

    yum(Yellow dog Updater Modified)是多个Linux发行版的软件包管理器,例如Redhat RHEL.CentOS和Fedora.yum主要用于自动安装.升级rpm软件包, ...

  9. 1.3Linux 终端命令格式

    Linux 终端命令格式 目标 了解终端命令格式 知道如何查阅终端命令帮助信息 01. 终端命令格式 bashcommand [-options] [parameter] 说明: command:命令 ...

  10. 使用Typora编写Markdown你真的会了吗

    目录 Typora 介绍 使用 常用快捷键 概述 标题 一级标题 二级标题 方式(推荐) 一级标题 二级标题 三级标题 四级标题 五级标题 六级标题 段落 粗体斜体删除线 下划线 注释 分割线 脚注 ...