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的Cookie.py模块支持冒号做key的方法
Dec 28 Python
Python的Flask框架中实现分页功能的教程
Apr 20 Python
python读写二进制文件的方法
May 09 Python
详解Python的Twisted框架中reactor事件管理器的用法
May 25 Python
使用Python的Flask框架表单插件Flask-WTF实现Web登录验证
Jul 12 Python
Python 中字符串拼接的多种方法
Jul 30 Python
Tesserocr库的正确安装方式
Oct 19 Python
python实现在遍历列表时,直接对dict元素增加字段的方法
Jan 15 Python
selenium+python截图不成功的解决方法
Jan 30 Python
python 实现查找文件并输出满足某一条件的数据项方法
Jun 12 Python
python实现坦克大战
Apr 24 Python
pycharm2020.1.2永久破解激活教程,实测有效
Oct 29 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
使用迭代器 遍历文件信息的详解
2013/06/08 PHP
Server.HTMLEncode让代码在页面里显示为源代码
2013/12/08 PHP
PHP获取QQ达人QQ信息的方法
2015/03/05 PHP
laradock环境docker-compose操作详解
2019/07/29 PHP
Swoole源码中如何查询Websocket的连接问题详解
2020/08/30 PHP
使用jquery的ajax需要注意的地方dataType的设置
2013/08/12 Javascript
浅谈javascript对象模型和function对象
2014/12/26 Javascript
Express实现前端后端通信上传图片之存储数据库(mysql)傻瓜式教程(一)
2015/12/10 Javascript
探析浏览器执行JavaScript脚本加载与代码执行顺序
2016/01/12 Javascript
javascript实现全角转半角的方法
2016/01/23 Javascript
js判断复选框是否选中及选中个数的实现代码
2016/05/30 Javascript
JQuery查找子元素find()和遍历集合each的方法总结
2017/03/07 Javascript
配置nodejs环境的方法
2017/05/13 NodeJs
Bootstrap下拉菜单更改为悬停(hover)触发的方法
2017/05/24 Javascript
浅谈React前后端同构防止重复渲染
2018/01/05 Javascript
使用vue + less 实现简单换肤功能的示例
2018/02/21 Javascript
JS获取并处理php数组的方法实例分析
2018/09/04 Javascript
js canvas实现二维码和图片合成的海报
2020/11/19 Javascript
Node.js 路由的实现方法
2019/06/05 Javascript
js 对象使用的小技巧实例分析
2019/11/08 Javascript
[56:46]2018DOTA2亚洲邀请赛 3.31 小组赛 B组 VP vs Effect
2018/04/01 DOTA
Python使用迭代器打印螺旋矩阵的思路及代码示例
2016/07/02 Python
利用Python-iGraph如何绘制贴吧/微博的好友关系图详解
2017/11/02 Python
Python实现的连接mssql数据库操作示例
2018/08/17 Python
浅谈pycharm的xmx和xms设置方法
2018/12/03 Python
python中matplotlib条件背景颜色的实现
2019/09/02 Python
美国职棒大联盟官方网上商店:MLBShop.com
2017/11/12 全球购物
酒店保安员岗位职责
2014/01/31 职场文书
法学院毕业生求职信
2014/06/25 职场文书
合唱兴趣小组活动总结
2014/07/10 职场文书
“六查”、“三学”、“三干”查摆问题整改措施
2014/09/27 职场文书
2014年新教师工作总结
2014/11/08 职场文书
2015年个人实习工作总结
2014/12/12 职场文书
《牧场之国》教学反思
2016/02/22 职场文书
如何使用Maxwell实时同步mysql数据
2021/04/08 MySQL
在ubuntu下安装go开发环境的全过程
2022/08/05 Golang