Django filter动态过滤与排序实现过程解析


Posted in Python onNovember 26, 2020

前期准备

在虚拟开发环境中安装:

pip install django-filter

在Django的项目配置文件中安装并配置django_filters应用:

INSTALLED_APPS = [
  ...
  'django_filters',
]

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

快速使用

model.py

class User(models.Model):
  # 模型字段
  name = models.CharField(max_length=10, verbose_name="姓名")
  sex = models.BooleanField(default=1, verbose_name="性别")
  age = models.IntegerField(verbose_name="年龄")
  phone = models.CharField(max_length=20, null=True, verbose_name="电话")
  addr = models.CharField(max_length=100,null=True,verbose_name="地址")

  class Meta:
    db_table = "tb_user"
    verbose_name = "用户"
    verbose_name_plural = verbose_name

新建filter.py:过滤器类

import django_filters
from .models import User

class UserFilter(django_filters.FilterSet):

  class Meta:
    model = User
    fields = ["name", "age"] #指定动态过滤的字段,默认精准匹配

注意:

Meta字段说明
model: 引用的模型,不是字符串
fields:指明过滤字段,可以是列表,列表中字典可以过滤,默认是判等;也可以字典,字典可以自定义操作
exclude = ['password'] 排除字段,不允许使用列表中字典进行过滤

view.py

from django_filters.rest_framework import DjangoFilterBackend
from rest_framework.generics import ListAPIView
from rest_framework import filters
class UserViewSet(ListAPIView):
  queryset = User.objects.all()  #获取数据
  serializer_class = UserModelSerializer #指定序列化类
  filter_class = UserFilter  # 指定过滤器类

serializers.py

from rest_framework import serializers
from .models import User
class UserModelSerializer(serializers.ModelSerializer):
  class Meta:
    model = User
    fields = "__all__"

urls.py

path('user/',UserViewSet.as_view()),

首先理解上面是动态过滤,前端在请求头如下传递参数,传递参数的个数是不同的,而动态过滤只会过滤:有参数,且参数有值的项。

http://ip:port/user/?name=查找内容&age=查找内容
http://ip:port/user/?name=&age=查找内容
http://ip:port/user/?name=查找内容&age=
http://ip:port/user/?name=&age=
http://ip:port/user/

精准过滤、模糊过滤并存

class UserFilter(django_filters.FilterSet):
  class Meta:
    model = User
    # fields = ["name", "age"]
    fields = {
      "name": ['exact','icontains'],
      "age": ['exact'],
    }

exact:默认过滤方式,精确过滤

icontains:模糊过滤

http://ip:port/user/?name=查找内容&name_icontains=查找内容&age=查找内容

范围过滤

class UserFilter(django_filters.FilterSet):
  class Meta:
    model = User
    # fields = ["name", "age"]
    fields = {
      "name": ['exact','icontains'],
      "age": ['exact','gte','lte'],
    }

对以上filter来说

name 精确查找
name__icontains 模糊查找
age 精准查找
age__gte 大于等于
age__lte 小于等于

排序

class UserFilter(django_filters.FilterSet):
#定义排序字段:依赖哪个字段排序
  sort = django_filters.OrderingFilter(fields=('age',))
  class Meta:
    model = User
    # fields = ["name", "age"]
    fields = {
      "name": ['exact','icontains'],
      "age": ['exact','gte','lte'],
    }

url示例

http://ip:port/user/?name=查找内容&sort=age:表示升序
http://ip:port/user/?name=查找内容&sort=-age:表示降序

补充知识

这部分可以参考:https://zhuanlan.zhihu.com/p/110060840

过滤器可以自定义字段,开始我们这样定义过滤字段,以及每个字段是相等运算,模糊匹配,还是范围查询,但是这样的写法可能不太直观。

fields = {
"name": ['exact','icontains'],
"age": ['exact','gte','lte'],
}

我们可以做如下类型改变

class BookFilter(filters.FilterSet):
  btitle = filters.CharFilter(field_name='title',lookup_expr='icontains')
  pub_year = filters.CharFilter(field_name='bpub_date',lookup_expr='year')
  pub_year__gt = filters.CharFilter(field_name='bpub_date',lookup_expr='year__gt')
  bread__gt = filters.NumberFilter(field_name='bread',lookup_expr="gt")
  bread__lt = filters.NumberFilter(field_name='bread',lookup_expr="lt")

  class Meta:
    model = Bookinfo
    fields = ['title','bread','bcomment']

http://127.0.0.1:8000/book/?title=&bread=&bcomment=&btitle=%E5%B0%84%E9%9B%95&pub_year=&pub_year__gt=&bread__gt=&bread__lt=

过滤器每个字段内部配置:

field_name: 过滤字段名,为对应模型中字段名

lookup_expr: 查询时所要进行的操作,是等值,范围、模糊匹配等

过滤器字段类型:

CharFilter 字符串类型
BooleanFilter 布尔类型
DateTimeFilter 日期时间类型
DateFilter 日期类型
DateRangeFilter 日期范围
TimeFilter 时间类型
NumberFilter 数值类型,对应模型中IntegerField, FloatField, DecimalField

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
分享python数据统计的一些小技巧
Jul 21 Python
Python3爬楼梯算法示例
Mar 04 Python
使用python实现ftp的文件读写方法
Jul 02 Python
Python模块汇总(常用第三方库)
Oct 07 Python
Python3 使用map()批量的转换数据类型,如str转float的实现
Nov 29 Python
python3中pip3安装出错,找不到SSL的解决方式
Dec 12 Python
python如何使用jt400.jar包代码实例
Dec 20 Python
Python代码生成视频的缩略图的实例讲解
Dec 22 Python
django实现将修改好的新模型写入数据库
Mar 31 Python
使用jupyter Nodebook查看函数或方法的参数以及使用情况
Apr 14 Python
python如何求圆的面积
Jul 01 Python
通过代码实例了解Python异常本质
Sep 16 Python
python中用ctypes模拟点击的实例讲解
Nov 26 #Python
python爬虫分布式获取数据的实例方法
Nov 26 #Python
python分布式爬虫中消息队列知识点详解
Nov 26 #Python
Flask-SocketIO服务端安装及使用代码示例
Nov 26 #Python
使用OpenCV校准鱼眼镜头的方法
Nov 26 #Python
最新PyCharm 2020.2.3永久激活码(亲测有效)
Nov 26 #Python
Django-celery-beat动态添加周期性任务实现过程解析
Nov 26 #Python
You might like
优化PHP代码的53条建议
2008/03/27 PHP
php实现文件下载实例分享
2014/06/02 PHP
php实现json编码的方法
2015/07/30 PHP
使用PHPCMS搭建wap手机网站
2015/09/20 PHP
PHP实现mysqli批量执行多条语句的方法示例
2017/07/22 PHP
PHP高并发和大流量解决方案整理
2019/12/24 PHP
jQuery TextBox自动完成条
2009/07/22 Javascript
Mootools 1.2教程 正则表达式
2009/09/15 Javascript
javascript 当前日期转化为中文的实现代码
2010/05/13 Javascript
使用JavaScript获取地址栏参数的方法
2014/12/19 Javascript
javascript相关事件的几个概念
2015/05/21 Javascript
JavaScript学习小结(一)——JavaScript入门基础
2015/09/02 Javascript
JavaScript获取各大浏览器信息图示
2015/11/20 Javascript
AngularJS模块学习之Anchor Scroll
2016/01/19 Javascript
jQuery表格插件datatables用法汇总
2016/03/29 Javascript
angular使用bootstrap方法手动启动的实例代码
2017/07/18 Javascript
BootStrap实现文件上传并带有进度条效果
2017/09/11 Javascript
vue项目实现记住密码到cookie功能示例(附源码)
2018/01/31 Javascript
Vue实现按钮旋转和移动位置的实例代码
2018/08/09 Javascript
浅谈JS和jQuery的区别
2019/03/27 jQuery
Vue配置marked链接添加target="_blank"的方法
2019/07/19 Javascript
JavaScript自定义超时API代码实例
2020/04/30 Javascript
python 生成目录树及显示文件大小的代码
2009/07/23 Python
python实现rest请求api示例
2014/04/22 Python
python 与GO中操作slice,list的方式实例代码
2017/03/20 Python
Python操作Mongodb数据库的方法小结
2019/09/10 Python
python各层级目录下import方法代码实例
2020/01/20 Python
五分钟学会怎么用Pygame做一个简单的贪吃蛇
2021/01/06 Python
国际书籍零售商:Wordery
2017/11/01 全球购物
施工安全协议书
2013/12/11 职场文书
导游词400字
2015/02/13 职场文书
党员志愿者服务倡议书
2015/04/29 职场文书
有关水浒传的读书笔记
2015/06/25 职场文书
小学语文教师研修感悟
2015/11/18 职场文书
环境保护宣传标语大全!
2019/06/28 职场文书
Python编程源码报错解决方法总结经验分享
2021/10/05 Python