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 相关文章推荐
在Django的URLconf中使用多个视图前缀的方法
Jul 18 Python
python开发之IDEL(Python GUI)的使用方法图文详解
Nov 12 Python
python实现多线程的两种方式
May 22 Python
Python selenium 三种等待方式详解(必会)
Sep 15 Python
python基础之入门必看操作
Jul 26 Python
对Python中gensim库word2vec的使用详解
May 08 Python
PyCharm-错误-找不到指定文件python.exe的解决方法
Jul 01 Python
python 监测内存和cpu的使用率实例
Nov 28 Python
python通过opencv实现图片裁剪原理解析
Jan 19 Python
python中提高pip install速度
Feb 14 Python
tensorflow学习笔记之tfrecord文件的生成与读取
Mar 31 Python
python之django路由和视图案例教程
Jul 26 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学习笔记(毕业设计)
2012/02/21 PHP
(PHP实现)只使用++运算实现加法,减法,乘法,除法
2013/06/27 PHP
解析zend Framework如何自动加载类
2013/06/28 PHP
深入浅出php socket编程
2015/05/13 PHP
php中smarty变量修饰用法实例分析
2015/06/11 PHP
PHP中仿制 ecshop验证码实例
2017/01/06 PHP
JS实现标签页效果(配合css)
2013/04/03 Javascript
JS字符串处理实例代码
2013/08/05 Javascript
JS创建类和对象的两种不同方式
2014/08/08 Javascript
JS 获取鼠标左右键的键值方法
2014/10/11 Javascript
jQuery链使用指南
2015/01/20 Javascript
理解JavaScript的变量的入门教程
2015/07/07 Javascript
JQ选择器_选择同类元素的第N个子元素的实现方法
2016/09/08 Javascript
AngularJS指令中的绑定策略实例分析
2016/12/14 Javascript
第一次记录Bootstrap table学习笔记(1)
2017/05/18 Javascript
详解nodejs异步I/O和事件循环
2017/06/07 NodeJs
vue发送websocket请求和http post请求的实例代码
2019/07/11 Javascript
js实现点赞效果
2020/03/16 Javascript
javascript设计模式 ? 迭代器模式原理与用法实例分析
2020/04/17 Javascript
javascript实现移动端红包雨页面
2020/06/23 Javascript
vue下载二进制流图片操作
2020/10/26 Javascript
[01:10]DOTA2次级职业联赛 - Fly战队宣传片
2014/12/01 DOTA
Python Web开发模板引擎优缺点总结
2014/05/06 Python
小结Python用fork来创建子进程注意事项
2014/07/03 Python
Python基于分水岭算法解决走迷宫游戏示例
2017/09/26 Python
python+pyqt5实现24点小游戏
2019/01/24 Python
一篇文章教你用python画动态爱心表白
2020/11/22 Python
详解pandas赋值失败问题解决
2020/11/29 Python
Python实现Excel自动分组合并单元格
2021/02/22 Python
css3和jquery实现自定义checkbox和radiobox组件
2014/04/22 HTML / CSS
英国最大的化装舞会服装网站:Fancydress.com
2017/08/15 全球购物
翻译专业应届生求职信
2013/11/23 职场文书
难忘的一课教学反思
2014/04/30 职场文书
学校安全生产月活动总结
2014/07/05 职场文书
森马旗舰店双十一营销方案
2014/09/29 职场文书
人事行政助理岗位职责
2015/04/11 职场文书