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之有容乃大的list(2)
Sep 15 Python
Python读取网页内容的方法
Jul 30 Python
在Python中执行系统命令的方法示例详解
Sep 14 Python
python实现求最长回文子串长度
Jan 22 Python
对pandas中iloc,loc取数据差别及按条件取值的方法详解
Nov 06 Python
Python设计模式之观察者模式原理与用法详解
Jan 16 Python
Python基于mysql实现学生管理系统
Feb 21 Python
Python中判断子串存在的性能比较及分析总结
Jun 23 Python
python爬虫开发之selenium模块详细使用方法与实例全解
Mar 09 Python
selenium+超级鹰实现模拟登录12306
Jan 24 Python
pytorch 一行代码查看网络参数总量的实现
May 12 Python
Python 数据可视化之Seaborn详解
Nov 02 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
关于时间计算的结总
2006/12/06 PHP
如何使用PHP批量去除文件UTF8 BOM信息
2013/08/05 PHP
php使用ob_flush不能每隔一秒输出原理分析
2015/06/02 PHP
php函数mkdir实现递归创建层级目录
2016/10/27 PHP
PHP高精确度运算BC函数库实例详解
2017/08/15 PHP
PHP创建文件及写入数据(覆盖写入,追加写入)的方法详解
2019/02/15 PHP
一个刚完成的layout(拖动流畅,不受iframe影响)
2007/08/17 Javascript
js验证模型自我实现的具体方法
2013/06/21 Javascript
JS实现简单的顶部定时关闭层效果
2014/06/15 Javascript
Javascript数据结构与算法之列表详解
2015/03/12 Javascript
js实现图片放大和拖拽特效代码分享
2015/09/05 Javascript
AngularJS模块学习之Anchor Scroll
2016/01/19 Javascript
jquery Easyui Datagrid实现批量操作(编辑,删除,添加)
2017/02/20 Javascript
AngularJS实现根据不同条件显示不同控件
2017/04/20 Javascript
基于JavaScript表单脚本(详解)
2017/10/18 Javascript
微信小程序上传多图到服务器并获取返回的路径
2019/05/05 Javascript
layui实现给某一列加点击事件
2019/10/26 Javascript
详解Vue中Axios封装API接口的思路及方法
2020/10/10 Javascript
[57:38]2018DOTA2亚洲邀请赛3月30日 小组赛A组 OpTic VS OG
2018/03/31 DOTA
Python正则表达式教程之三:贪婪/非贪婪特性
2017/03/02 Python
Android基于TCP和URL协议的网络编程示例【附demo源码下载】
2018/01/23 Python
python计算日期之间的放假日期
2018/06/05 Python
wxPython:python首选的GUI库实例分享
2019/10/05 Python
python数据预处理 :样本分布不均的解决(过采样和欠采样)
2020/02/29 Python
appium+python adb常用命令分享
2020/03/06 Python
Python实例教程之检索输出月份日历表
2020/12/16 Python
全球性的在线商店:Vogca
2019/05/10 全球购物
Bravofly德国:预订廉价航班和酒店
2019/09/22 全球购物
介绍一下JMS编程步骤
2015/09/22 面试题
中班幼儿评语大全
2014/04/30 职场文书
关工委先进个人事迹材料
2014/05/23 职场文书
交通安全标语
2014/06/06 职场文书
如何签定毕业生就业协议书
2014/09/28 职场文书
2015元旦家电促销活动策划方案
2014/12/09 职场文书
环卫工作个人总结
2015/03/04 职场文书
毕业设计论文致谢词
2015/05/14 职场文书