自定义模型类

本篇章介绍Flask自定义模型类的概念,以及写一个快速入门的示例,基本内容如下:

  • 定义两个模型类,并创建数据库表
  • 创建数据,写入数据库
  • 编写模板以及视图函数,在页面展示数据

定义模型

模型表示程序使用的数据实体,在Flask-SQLAlchemy中,模型一般是Python类,继承自db.Model,db是SQLAlchemy类的实例,代表程序使用的数据库。

类中的属性对应数据库表中的列。id为主键,是由Flask-SQLAlchemy管理。db.Column类构造函数的第一个参数是数据库列和模型属性类型。

如下示例:定义了两个模型类,作者和书名。

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import pymysql
pymysql.install_as_MySQLdb()app = Flask(__name__)class Config(object):"""配置参数"""# 设置连接数据库的URLuser = 'root'password = '*********'database = 'flask_ex'app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://%s:%s@127.0.0.1:3306/%s' % (user,password,database)# 设置sqlalchemy自动更跟踪数据库SQLALCHEMY_TRACK_MODIFICATIONS = True# 查询时会显示原始SQL语句# app.config['SQLALCHEMY_ECHO'] = True# 禁止自动提交数据处理app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = False# 读取配置
app.config.from_object(Config)# 创建数据库sqlalchemy工具对象
db = SQLAlchemy(app)#定义模型类-作者
class Author(db.Model):__tablename__ = 'author'id = db.Column(db.Integer,primary_key=True)name = db.Column(db.String(32),unique=True)email = db.Column(db.String(64))au_book = db.relationship('Book',backref='author')def __str__(self):return 'Author:%s' %self.name#定义模型类-书名
class Book(db.Model):__tablename__ = 'books'id = db.Column(db.Integer,primary_key=True)info = db.Column(db.String(32),unique=True)leader = db.Column(db.String(32))au_book = db.Column(db.Integer,db.ForeignKey('author.id'))def __str__(self):return 'Book:%s,%s'%(self.info,self.lead)if __name__ == '__main__':# 删除所有表db.drop_all()# 创建所有表db.create_all()

执行脚本之后,到mysql中查看表结构如下。

创建表 db.create_all()

mysql> show tables;
+--------------------+
| Tables_in_flask_ex |
+--------------------+
| author             |
| books              |
+--------------------+
4 rows in set (0.00 sec)mysql>

查看author表结构 desc author

mysql> desc author;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int(11)     | NO   | PRI | NULL    | auto_increment |
| name  | varchar(32) | YES  | UNI | NULL    |                |
| email | varchar(64) | YES  |     | NULL    |                |
+-------+-------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

查看books表结构 desc books

mysql> desc books;
+---------+-------------+------+-----+---------+----------------+
| Field   | Type        | Null | Key | Default | Extra          |
+---------+-------------+------+-----+---------+----------------+
| id      | int(11)     | NO   | PRI | NULL    | auto_increment |
| info    | varchar(32) | YES  | UNI | NULL    |                |
| leader  | varchar(32) | YES  |     | NULL    |                |
| au_book | int(11)     | YES  | MUL | NULL    |                |
+---------+-------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

创建数据

...
if __name__ == '__main__':# 生成数据author_1 = Author(name='我吃西红柿', email='xihongshi@163.com')author_2 = Author(name='萧潜', email='xiaoqian@126.com')author_3 = Author(name='唐家三少', email='sanshao@163.com')book_1 = Book(info='吞噬星空', leader='罗峰')book_2 = Book(info='寸芒', leader='李杨')book_3 = Book(info='飘渺之旅', leader='李强')book_4 = Book(info='冰火魔厨', leader='融念冰')# 把数据提交给用户会话db.session.add_all([author_1, author_2, author_3, book_1, book_2, book_3, book_4])# 提交会话db.session.commit()

在main方法下创建多个作者以及书本的数据,执行脚本后,查看mysql数据,如下:

mysql> select * from author;
+----+-----------------+-------------------+
| id | name            | email             |
+----+-----------------+-------------------+
|  1 | 我吃西红柿      | xihongshi@163.com |
|  2 | 萧潜            | xiaoqian@126.com  |
|  3 | 唐家三少        | sanshao@163.com   |
+----+-----------------+-------------------+
3 rows in set (0.00 sec)mysql> select * from books;
+----+--------------+-----------+---------+
| id | info         | leader    | au_book |
+----+--------------+-----------+---------+
|  1 | 吞噬星空     | 罗峰      |    NULL |
|  2 | 寸芒         | 李杨      |    NULL |
|  3 | 飘渺之旅     | 李强      |    NULL |
|  4 | 冰火魔厨     | 融念冰    |    NULL |
+----+--------------+-----------+---------+
4 rows in set (0.00 sec)mysql>

使用 flask_wtf 编写视图函数的表单

1.编写完整flask应用,包含视图函数

from flask import Flask,render_template,url_for,redirect,request
from flask_sqlalchemy import SQLAlchemy
import pymysql
pymysql.install_as_MySQLdb()
# 导入Flask-WTF表单
from flask_wtf import FlaskForm
# 导入表单所需要的字段类型
from wtforms import StringField, PasswordField, SubmitField
# 导入表单的验证器
from wtforms.validators import DataRequired, EqualTo
# 启动命令的管理类
from flask_script import Manager   app = Flask(__name__)class Config(object):"""配置参数"""# 设置连接数据库的URLuser = 'root'password = '*************'database = 'flask_ex'app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://%s:%s@127.0.0.1:3306/%s' % (user,password,database)# 设置sqlalchemy自动更跟踪数据库SQLALCHEMY_TRACK_MODIFICATIONS = True# 查询时会显示原始SQL语句# app.config['SQLALCHEMY_ECHO'] = True# 禁止自动提交数据处理app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = False# 设置密钥,用于csrf_token的加解密app.config["SECRET_KEY"] = "xhosd6f982yfhowefy29f"# 读取配置
app.config.from_object(Config)# 创建数据库sqlalchemy工具对象
db = SQLAlchemy(app)#定义模型类-作者
class Author(db.Model):__tablename__ = 'author'id = db.Column(db.Integer,primary_key=True)name = db.Column(db.String(32),unique=True)email = db.Column(db.String(64))au_book = db.relationship('Book',backref='author')def __str__(self):return 'Author:%s' %self.name#定义模型类-书名
class Book(db.Model):__tablename__ = 'books'id = db.Column(db.Integer,primary_key=True)info = db.Column(db.String(32),unique=True)leader = db.Column(db.String(32))au_book = db.Column(db.Integer,db.ForeignKey('author.id'))def __str__(self):return 'Book:%s,%s'%(self.info,self.leader)# 定义表单的模型类,用来添加书本以及作者数据
class AddAuthorBook(FlaskForm):"""自定义的注册表单模型类"""# DataRequired 保证数据必须填写,并且不能为空author_name = StringField(label="作者名称", validators=[DataRequired("作者名称不能为空")]) #  参数:名字,验证器列表book_info = StringField(label="书本信息", validators=[DataRequired("书本信息不能为空")])submit = SubmitField(label="添加")@app.route('/',methods=['GET','POST'])
def index():#查询所有作者和书名信息authors = Author.query.all()books = Book.query.all()#创建表单对象form = AddAuthorBook()if form.validate_on_submit():#获取表单输入数据author_name = form.author_name.databook_info = form.book_info.data#把表单数据存入模型类db_author = Author(name=author_name)db_book = Book(info=book_info)db_book.leader = author_namedb_book.au_book = db_author.id#提交会话db.session.add_all([db_author,db_book])db.session.commit()#添加数据后,再次查询所有作者和书名信息authors = Author.query.all()books = Book.query.all()return render_template('index.html',author=authors,book=books,form=form)else:if request.method=='GET':render_template('index.html', author=authors, book=books,form=form)return render_template('index.html',author=authors,book=books,form=form)#删除作者
@app.route('/delete_author<id>')
def delete_author(id):print('delete author id = %s' % id)#精确查询需要删除的作者idauthor = Author.query.get(id)db.session.delete(author)db.session.commit()#直接重定向到index视图函数return redirect(url_for('index'))#删除书名
@app.route('/delete_book<id>')
def delete_book(id):print('delete book id = %s' % id)#精确查询需要删除的书名idbook = Book.query.get(id)db.session.delete(book)db.session.commit()#直接重定向到index视图函数return redirect(url_for('index'))if __name__ == '__main__':# 创建Manager管理类的对象manager = Manager(app)# 通过管理对象来启动flaskmanager.run()

2.设置index.html模板

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><h1>玄幻系列</h1><form method="post">{{ form.csrf_token }}<p>作者:{{ form.author_name }}</p><p>书名:{{ form.book_info }}</p><p>{{ form.submit }}</p></form><hr><ul>{% for item in author %}<li>{{ item }}</li><a href='/delete_author{{ item.id }}'>删除</a>{% endfor %}</ul><hr><ul>{% for item in book %}<li>{{ item }}</li><a href='/delete_book{{ item.id }}'>删除</a>{% endfor %}</ul>
</body>
</html>

3.执行python3 db_demo2.py runserver启动服务后,进行功能测试

从上面的几个示例,基本清楚讲解了模型类如何定义,表单如何设置,模板中如何展示数据,表单如何提交数据,数据如何设置删除等功能。

Flask 自定义模型类相关推荐

  1. Flask学习笔记(十四)自定义模型类

    自定义模型类 定义模型 模型表示程序使用的数据实体,在Flask-SQLAlchemy中,模型一般是Python类,继承自db.Model,db是SQLAlchemy类的实例,代表程序使用的数据库. ...

  2. Flask之自定义模型类

    4.3自定义模型类 定义模型 模型表示程序使用的数据实体,在Flask-SQLAlchemy中,模型一般是Python类,继承自db.Model,db是SQLAlchemy类的实例,代表程序使用的数据 ...

  3. Qt中的自定义模型类

    文章目录 1 Qt中的通用模型类 1.1 Qt中的通用模型类 1.2 Qt中的变体类型QVariant 2 自定义模型类 2.1 自定义模型类设计分析 2.2 自定义模型类数据层.数据表示层.数据组织 ...

  4. Django模型类与后台管理

    文章目录 模型类 模型类设计 生成迁移文件 执行迁移生成表 通过模型类操作数据表 后台管理 1.本地化 2.创建管理员 3. 管理员登陆网址 4.注册模型类 5.自定义表单 模型类 模型类设计 在应用 ...

  5. Flask——创建表单模型类与模板使用

    首先引入表单扩展Flask-WTF: pip install Flask-WTF 使用Flask-WTF扩展可以验证后端接受到的信息,防止恶意攻击. WTForms支持的HTML标准字段 字段对象 说 ...

  6. 【Flask项目2】模型类的映射方式新版本和旧版本(4)

    方式一:模型类的映射方式旧版本 1.Flask-Migrate介绍 k-migrate可以十分方便的进行数据库的迁移与映射,将我们修改过的ORM模型映射到数据库中.flask_migrate是基于Al ...

  7. 【Flask项目】项目准备之-创建User模型类

    项目目录 models目录下的__init__.py文件 from flask_sqlalchemy import SQLAlchemy db=SQLAlchemy() shop目录下的__init_ ...

  8. Django框架(16.Django中的模型类管理器以及自定义管理器)

    模型类.objects.all()->objects是一个什么东西呢? 答:objects是Django帮我自动生成的管理器对象,通过这个管理器可以实现对数据的查询. objects是model ...

  9. Flask框架(flask中的数据库SQLAlchemy(python3),配置、模型类、创建表)

    1.  SQLAlchemy是一个关系型数据库框架, 它提供了高层的ORM和底层的原生数据库的操作. flask-sqlalchemy是一个简化了SQLAlchemy操作的flask扩展. 2. 安装 ...

最新文章

  1. 动手打造自己强大的右键菜单
  2. js php滚动图代码,JavaScript_JS实现的N多简单无缝滚动代码(包含图文效果),本文实例讲述了JS实现的N多简 - phpStudy...
  3. 【2008】奥运门票4月15日开始预定 四种购买方式供选
  4. 神策数据受邀参加第五届中国全渠道峰会,聚焦大数据驱动线上线下融合
  5. 步苹果iOS的后尘,谷歌Android12“翻车”,更新需谨慎?
  6. Memcached 教程 | 菜鸟教程
  7. 斐波那契数列(复习)
  8. 第四季-专题5-内核模块开发
  9. Web前端性能优化的9大问题
  10. 如何将一个长URL转换为一个短URL?
  11. idea代码编辑CPU使用率飙升100%
  12. snmpwalk与snmpget的区别
  13. 2020-12-12
  14. python中pip安装、升级包用法详解
  15. android 开发的步骤
  16. cf大区服务器显示人数合区后,CF:各大区迎来合并,未来只有4大战区,看看自己属于哪个战区?...
  17. R语言ggplot2可视化:使用patchwork包将两个ggplot2可视化结果组合起来、使用labs函数为第两个子图都添加标题信息(subtitle for each subplots)
  18. Geb UI 自动化手册(4: 页面内容交互)
  19. 可怕!CPU 竟成了黑客的帮凶
  20. 亚马逊kindle设置_如何从亚马逊网站管理您的Kindle和书籍

热门文章

  1. select or and
  2. 国民体质测试系统软件,广西国民体质监测中心app
  3. 怎么把一堆名字放到excel_怎么将一堆excel名字选出来移动排列
  4. RPA之家实战 百度OCR识别发票
  5. ECSHOP编辑器【ECSHOP超级编辑器插件】全网最强编辑器
  6. CString与Byte数组的相互转化
  7. Android仿qq聊天记录长按删除功能效果
  8. [从零开始学习FPGA编程-50]:视野篇 - 芯片是如何被制造出来的?芯片制造的十三大步骤。
  9. 去年报录比21:1的211大学,计算机专硕今年如何?
  10. 一年一度的京东618,“买买买”背后究竟隐藏了多少“黑科技”?