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学习资料
Feb 08 Python
Python定时执行之Timer用法示例
May 27 Python
Python中if __name__ == '__main__'作用解析
Jun 29 Python
python+selenium开发环境搭建图文教程
Aug 11 Python
Python实现的购物车功能示例
Feb 11 Python
python处理document文档保留原样式
Sep 23 Python
详解Python3迁移接口变化采坑记
Oct 11 Python
Python中zip()函数的解释和可视化(实例详解)
Feb 16 Python
Pycharm最常用的快捷键及使用技巧
Mar 05 Python
浅析Python打包时包含静态文件处理方法
Jan 15 Python
python基于tkinter制作m3u8视频下载工具
Apr 24 Python
Python爬虫框架之Scrapy中Spider的用法
Jun 28 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
一个高ai的分页函数和一个url函数
2006/10/09 PHP
$_GET['goods_id']+0 的使用详解
2013/06/06 PHP
Linux下编译redis和phpredis的方法
2016/04/07 PHP
php装饰者模式简单应用案例分析
2019/10/23 PHP
js GridView 实现自动计算操作代码
2009/03/25 Javascript
jQuery ajax 路由和过滤器使用说明
2011/08/02 Javascript
jquery创建并行对象或者合并对象的实现代码
2012/10/10 Javascript
导航跟随滚动条置顶移动示例代码
2013/09/11 Javascript
js 判断图片是否加载完以及实现图片的预下载
2014/08/14 Javascript
JS实现OCX控件的事件响应示例
2014/09/17 Javascript
基于jQuery实现点击弹出层实例代码
2016/01/01 Javascript
实例讲解JS中setTimeout()的用法
2016/01/28 Javascript
js删除局部变量的实现方法
2016/06/25 Javascript
JS实现复制功能
2017/03/01 Javascript
js实现3D图片展示效果
2017/03/09 Javascript
通过构造函数实例化对象的方法
2017/06/28 Javascript
详解关于vue-area-linkage走过的坑
2018/06/27 Javascript
深入理解基于vue-cli的webpack打包优化实践及探索
2019/10/14 Javascript
vue实现一个6个输入框的验证码输入组件功能的实例代码
2020/06/29 Javascript
Ant Design Vue table中列超长显示...并加提示语的实例
2020/10/31 Javascript
jQuery实现查看图片功能
2020/12/01 jQuery
如何正确解决VuePress本地访问出现资源报错404的问题
2020/12/03 Vue.js
Python工程师面试题 与Python Web相关
2016/01/14 Python
python SVD压缩图像的实现代码
2019/11/05 Python
python 解压、复制、删除 文件的实例代码
2020/02/26 Python
Tensorflow之梯度裁剪的实现示例
2020/03/08 Python
浅谈tensorflow使用张量时的一些注意点tf.concat,tf.reshape,tf.stack
2020/06/23 Python
Python Selenium自动化获取页面信息的方法
2020/08/31 Python
CSS3 Media Queries详细介绍和使用实例
2014/05/08 HTML / CSS
html5表单及新增的改良元素详解
2016/06/07 HTML / CSS
2015年学校减负工作总结
2015/05/19 职场文书
九九重阳节致辞
2015/07/31 职场文书
python 爬取哔哩哔哩up主信息和投稿视频
2021/06/07 Python
Python读取和写入Excel数据
2022/04/20 Python
Python docx库删除复制paragraph及行高设置图片插入示例
2022/07/23 Python
CentOS7 minimal 最小化安装网络设置过程
2022/12/24 Servers