Flask_admin 笔记六 modelView的内置方法
增加model后端
Flask-Admin对与之配合的数据库模型做了一些假设。 如果要实现自己的数据库后端,并且Flask-Admin的模型视图仍可按预期工作,则应注意以下事项:
1) 每一个model必须有主键,但不限定数据类型和主键名
2) 确保每一个model的属性都是可以访问的
在此基础上,你可以通过继承BaseMiodelView类来实现数据库后端的扩展,并实现下面列出的一系列方法:
1 扩展BaseModelView
首先定义一个从BaseModelView派生的新类:
- class MyDbModel(BaseModelView):
- pass
这个类继承了BaseModelView的__init__方法,它接受一个模型类作为第一个参数。 模型类存储为属性self.model,以便其他方法可以访问它。
现在,为新的类实现以下脚手架方法:
1.1 get_pk_value()
该方法从模型实例中返回一个主键值。 在SQLAlchemy后端,它使用scaffold_pk()从模型获得主键,缓存它,然后在需要时从模型返回值。
例子:
- class MyDbModel(BaseModelView):
- def get_pk_value(self, model):
- return self.model.id
1.2 scaffold_list_columns()
返回列表视图要展示的列。例子:
- class MyDbModel(BaseModelView):
- def scaffold_list_columns(self):
- columns = []
- for p in dir(self.model):
- attr = getattr(self.model, p)
- if isinstance(attr, MyDbColumn):
- columns.append(p)
- return columns
1.3 scaffold_sortable_columns()
返回可排序列的字典。 字典中的键应该对应于模型的字段名称。 值应该是那些将用于排序的变量。
例如,在SQLAlchemy后端可以按外键字段进行排序。 所以,如果有一个名为user的字段,它是Users表的一个外键,并且Users表也有一个名称字段,那么这个键将是user的value将是:Users.name。
如果您的后端不支持排序,则返回None或空字典。
1.4 init_search()
初始化搜索功能。 如果您的后端支持全文搜索,请进行初始化并返回True。 如果您的后端不支持全文搜索,请返回False。
例如,SQLAlchemy后端读取self.searchable_columns的值,并验证是否所有字段都是文本类型,如果它们定位到当前的模型(如果不是,则会添加一个连接等)并缓存这些信息以备将来使用。
1.5 scaffold_form()
在模型里定义WTForms表单,例子:
- class MyDbModel(BaseModelView):
- def scaffold_form(self):
- class MyForm(Form):
- pass
- # Do something
- return MyForm
1.6 get_list()
这个方法应该返回带有分页,排序等应用的模型实例列表。
对于SQLAlchemy后端,它看起来像:
1)如果搜索已启用且提供的搜索值不为空,将会为self.searchable_columns中的每个字段生成LIKE语句
2)如果传递过滤值,请使用值调用apply方法:
- for flt, value in filters:
- query = self._filters[flt].apply(query, value)
3)执行查询获取数据库中的总行数(count)
4)如果sort_column被传递,会做类似的事情(带有一些额外的FK逻辑,在这个例子中省略):
- if sort_desc:
- query = query.order_by(desc(sort_field))
- else:
- query = query.order_by(sort_field)
5)应用分页
6)返回总条数和列表的元组
1.7 get_one()
根据主键返回model数据
1.8 create_model()
通过表单创建一个model的实例
1.9 update_model()
更新表单model的实例
1.10 delete_model()
从数据存储中删除特定的model数据
1.11 is_valid_filter()
验证返回的数据是否是有效的
1.12scaffold_filters()
返回一个模型字段的过滤器对象列表。
对于self.column_filters设置中的每个条目,该方法都会被调用一次。
如果后端不知道如何为提供的字段生成过滤器,则应该返回None。
例如:
- class MyDbModel(BaseModelView):
- def scaffold_filters(self, name):
- attr = getattr(self.model, name)
- if isinstance(attr, MyDbTextField):
- return [MyEqualFilter(name, name)]
2,实现过滤
每个模型后端都应该有自己的一组过滤器实现。 在非SQLAlchemy后端不能使用SQLAlchemy模型中的过滤器。 这也意味着不同的后端可能有不同的可用过滤器集合。
过滤器是从BaseFilter派生的类,它实现了至少两种方法:
1. apply()
2. operation()
apply方法接受两个参数:查询对象和来自客户端的值。 在这里您可以为过滤器类型添加过滤逻辑。
让我们以SQLAlchemy模型后端为例:
所有SQLAlchemy过滤器都从BaseSQLAFilter类派生。
每个过滤器都实现一个简单的过滤器SQL操作(如,not like,大于等),并接受一列作为输入参数。每当模型视图要将筛选器应用于查询对象时,它将在具有查询和值的筛选器类中调用apply方法。 过滤器将应用实际的过滤器操作。
- class MyBaseFilter(BaseFilter):
- def __init__(self, column, name, options=None, data_type=None):
- super(MyBaseFilter, self).__init__(name, options, data_type)
- self.column = column
- class MyEqualFilter(MyBaseFilter):
- def apply(self, query, value):
- return query.filter(self.column == value)
- def operation(self):
- return gettext('equals')
- # You can validate values. If value is not valid,
- # return `False`, so filter will be ignored.
- def validate(self, value):
- return True
- # You can "clean" values before they will be
- # passed to the your data access layer
- def clean(self, value):
- return value
如果您在添加新模型后端时遇到问题,请随时提问。 此外,如果遇到困难,请尝试查看SQLAlchemy模型后端并将其用作参考。
Flask_admin 笔记六 modelView的内置方法的更多相关文章
- python循环与基本数据类型内置方法
今天又是充满希望的一天呢 一.python循环 1.wuile与else连用 当while没有被关键'break'主动结束的情况下 正常结束循环体代码之后会执行else的子代码 "" ...
- Python之路(第二十六篇) 面向对象进阶:内置方法
一.__getattribute__ object.__getattribute__(self, name) 无条件被调用,通过实例访问属性.如果class中定义了__getattr__(),则__g ...
- day6 六、元组、字典、集合的基本操作和内置方法
一.元组 1.定义 # 元组tuple # 记录多个值,当值没有改的需求是,建议用元组更好 # 定义:在()内用逗号分开任意类型的值 # name = (, , 300.5]) # print(nam ...
- 20181121笔记(for,数字类型和字符串类型的内置方法)
1.for循环 for循环可以遍历任何序列的项目,如一个列表或者一个字符串. for循环字典时默认取出key: dic={'x':111,'y':222,'z:333'}for k in dic: ...
- Python笔记(二十一)_内置函数、内置方法
内置函数 issubclass(class1,class2) 判断class1类是否为class2类的子类,返回True和False 注意1:类会被认为是自身的子类 >>>issub ...
- python常用数据类型内置方法介绍
熟练掌握python常用数据类型内置方法是每个初学者必须具备的内功. 下面介绍了python常用的集中数据类型及其方法,点开源代码,其中对主要方法都进行了中文注释. 一.整型 a = 100 a.xx ...
- Python的内置方法
一 isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 class Foo(object) ...
- Python之路(第二十九篇) 面向对象进阶:内置方法补充、异常处理
一.__new__方法 __init__()是初始化方法,__new__()方法是构造方法,创建一个新的对象 实例化对象的时候,调用__init__()初始化之前,先调用了__new__()方法 __ ...
- Python之旅Day3 文件操作 函数(递归|匿名|嵌套|高阶)函数式编程 内置方法
知识回顾 常见五大数据类型分类小结:数字.字符串.列表.元组.字典 按存值个数区分:容器类型(列表.字典.元组) 标量原子(数字.字符串) 按是否可变区分:可变(列表.字典) 不可变(数字.字符串.元 ...
随机推荐
- OneAPM大讲堂 | Metrics, Tracing 和 Logging 的关系
[编者按]这是在 OpenTracing 和分布式追踪领域内广受欢迎的一片博客文章.在构建监控系统时,大家往往在这几个名词和方式之间纠结. 通过这篇文章,作者很好的阐述了分布式追踪.统计指标与日志之间 ...
- [20170623]利用传输表空间恢复部分数据.txt
[20170623]利用传输表空间恢复部分数据.txt --//昨天我测试使用传输表空间+dblink,上午补充测试发现表空间设置只读才能执行impdp导入原数据,这个也很好理解.--//这样的操作模 ...
- 比较分析C++、Java、Python、R语言的面向对象特征,这些特征如何实现的?有什么相同点?
一门课的课后题答案,在这里备份一下: 面向对象程序设计语言 – 比较分析C++.Java.Python.R语言的面向对象特征,这些特征如何实现的?有什么相同点? C++ 语言的面向对象特征: 对象模 ...
- 初识Python - Python的历史(转)
声明: 本文转自维基百科 如有意见请联系删除 综述 该编程语言 的Python是在20世纪80年代末的设想,和实施是在1989年12月开始由吉多·范罗苏姆在CWI在荷兰的继任者农行能够异常处理,并与接 ...
- 常见的web攻击方式
跨站脚本攻击(XSS) 概述 跨站脚本攻击(XSS,Cross-site scripting),指攻击者在网页中嵌入恶意脚本程序,是最常见和基本的攻击WEB网站的方法.攻击者在网页上发布包含攻击性代码 ...
- Beta冲刺! Day3 - 砍柴
Beta冲刺! Day3 - 砍柴 今日已完成 晨瑶:追查进度:确定推荐算法 昭锡:查看Note模块的处理逻辑.查找主页UI的解决方案 永盛:数据库的大量整合和新建,备份和还原:完成部分新的逻辑 立强 ...
- UG/NX 8.0安装方法(图文详解)
UG8.0,自从被西门子收购后改名为NX,也称NX8.0,作为一款非常优秀三维模具设计软件.他可以针对用户的虚拟产品设计和工艺设计的需求,提供经过实践验证的解决方案.其以全面的设计概念.良好的界面受到 ...
- MapReduce全局变量之捉虫记
全局变量 写MapReduce程序时候,有时候须要用到全局变量,经常使用的全局变量实现由三种方式: 通过作业的Configuration传递全局变量.作业初始化的时候.conf.set(),须要的时候 ...
- ESP-手机--双向通信模式
1 AP 接受手机 2 STA(密码固定)连接路由器,AP接受手机 3 STA(密码灵活)连接路由器,AP接受手机 1 AP 接受手机 #include <ESP8266WiFi.h> ...
- for-in和for-of,forEach和Map
for-in和for-of 1. for-in循环实际是为循环”enumerable“对象而设计的,是用来循环带有字符串key的对象的. 使用for in会遍历数组所有的可枚举属性,包括原型.所以fo ...