关键词:
4.3自定义模型类
定义模型
模型表示程序使用的数据实体,在Flask-SQLAlchemy中,模型一般是Python类,继承自db.Model,db是SQLAlchemy类的实例,代表程序使用的数据库。
类中的属性对应数据库表中的列。id为主键,是由Flask-SQLAlchemy管理。db.Column类构造函数的第一个参数是数据库列和模型属性类型。
如下示例:定义了两个模型类,作者和书名。
#coding=utf-8 from flask import Flask,render_template,redirect,url_for from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) #设置连接数据 app.config[‘SQLALCHEMY_DATABASE_URI‘] = ‘mysql://root:[email protected]:3306/test1‘ #设置每次请求结束后会自动提交数据库中的改动 app.config[‘SQLALCHEMY_COMMIT_ON_TEARDOWN‘] = True #设置成 True,SQLAlchemy 将会追踪对象的修改并且发送信号。这需要额外的内存, 如果不必要的可以禁用它。 app.config[‘SQLALCHEMY_TRACK_MODIFICATIONS‘] = True #实例化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)
创建表 db.create_all()
查看author表结构 desc author
查看books表结构 desc books
#coding=utf-8 from flask import Flask,render_template,url_for,redirect,request from flask_sqlalchemy import SQLAlchemy from flask_wtf import FlaskForm from wtforms.validators import DataRequired from wtforms import StringField,SubmitField app = Flask(__name__) app.config[‘SQLALCHEMY_DATABASE_URI‘] = ‘mysql://root:[email protected]/test1‘ app.config[‘SQLALCHEMY_COMMIT_ON_TEARDOWN‘] = True app.config[‘SQLALCHEMY_TRACK_MODIFICATIONS‘] = True app.config[‘SECRET_KEY‘]=‘s‘ db = SQLAlchemy(app) #创建表单类,用来添加信息 class Append(Form): au_info = StringField(validators=[DataRequired()]) bk_info = StringField(validators=[DataRequired()]) submit = SubmitField(u‘添加‘) @app.route(‘/‘,methods=[‘GET‘,‘POST‘]) def index(): #查询所有作者和书名信息 author = Author.query.all() book = Book.query.all() #创建表单对象 form = Append() if form.validate_on_submit(): #获取表单输入数据 wtf_au = form.au_info.data wtf_bk = form.bk_info.data #把表单数据存入模型类 db_au = Author(name=wtf_au) db_bk = Book(info=wtf_bk) #提交会话 db.session.add_all([db_au,db_bk]) db.session.commit() #添加数据后,再次查询所有作者和书名信息 author = Author.query.all() book = Book.query.all() return render_template(‘index.html‘,author=author,book=book,form=form) else: if request.method==‘GET‘: render_template(‘index.html‘, author=author, book=book,form=form) return render_template(‘index.html‘,author=author,book=book,form=form) #删除作者 @app.route(‘/delete_author<id>‘) def delete_author(id): #精确查询需要删除的作者id au = Author.query.filter_by(id=id).first() db.session.delete(au) #直接重定向到index视图函数 return redirect(url_for(‘index‘)) #删除书名 @app.route(‘/delete_book<id>‘) def delete_book(id): #精确查询需要删除的书名id bk = Book.query.filter_by(id=id).first() db.session.delete(bk) #直接重定向到index视图函数 return redirect(url_for(‘index‘)) if __name__ == ‘__main__‘: db.drop_all() db.create_all() #生成数据 au_xi = Author(name=‘我吃西红柿‘,email=‘[email protected]‘) au_qian = Author(name=‘萧潜‘,email=‘[email protected]‘) au_san = Author(name=‘唐家三少‘,email=‘[email protected]‘) bk_xi = Book(info=‘吞噬星空‘,lead=‘罗峰‘) bk_xi2 = Book(info=‘寸芒‘,lead=‘李杨‘) bk_qian = Book(info=‘飘渺之旅‘,lead=‘李强‘) bk_san = Book(info=‘冰火魔厨‘,lead=‘融念冰‘) #把数据提交给用户会话 db.session.add_all([au_xi,au_qian,au_san,bk_xi,bk_xi2,bk_qian,bk_san]) #提交会话 db.session.commit() app.run(debug=True)
生成数据后,查看数据:
模板页面示例:
<h1>玄幻系列</h1> <form method="post"> form.csrf_token <p>作者: form.au_info </p> <p>书名: form.bk_info </p> <p> form.submit </p> </form> <ul> <li>% for x in author %</li> <li> x </li><a href=‘/delete_author x.id ‘>删除</a> <li>% endfor %</li> </ul> <hr> <ul> <li>% for x in book %</li> <li> x </li><a href=‘/delete_book x.id ‘>删除</a> <li>% endfor %</li> </ul>
添加数据后,查看数据:
jvm进阶之自定义类加载器(代码片段)
自定义类加载器1.作用2.场景3.注意4.实现1.作用隔离加载类在某些框架内进行中间件与应用的模块隔离,把类加载到不同的环境。修改类加载的方式类的加载模型并非强制的,应该根据实际情况在某个时间点按需进行动态... 查看详情
jvm进阶之自定义类加载器(代码片段)
自定义类加载器1.作用2.场景3.注意4.实现1.作用隔离加载类在某些框架内进行中间件与应用的模块隔离,把类加载到不同的环境。修改类加载的方式类的加载模型并非强制的,应该根据实际情况在某个时间点按需进行动态... 查看详情
flask框架从入门到精通之自定义response(代码片段)
知识点:1、自定义响应信息2、返回Json一、概况我们都知道当浏览器发起一个请求时,服务器会给一个响应。这个响应包含了返回的内容类型,状态码,服务器版本等一些。如下图:如果我们不进行修改这里... 查看详情
mapreduce之自定义inputformat(代码片段)
在企业开发中,Hadoop框架自带的InputFormat类型不能满足所有应用场景,需要自定义InputFormat来解决实际问题。自定义InputFormat步骤如下:(1)自定义一个类继承FilelnputFormat。(2)自定义一个类继承RecordReader,实现一次读取一个完... 查看详情
flask框架从入门到精通之自定义response(代码片段)
知识点:1、自定义响应信息2、返回Json一、概况我们都知道当浏览器发起一个请求时,服务器会给一个响应。这个响应包含了返回的内容类型,状态码,服务器版本等一些。如下图:如果我们不进行修改这里... 查看详情
flask从入门到精通之自定义错误界面
如果你在浏览器的地址栏中输入了不可用的路由,那么会显示一个状态码为404的错误页面。现在这个错误页面太简陋、平庸,而且样式和使用了Bootstrap的页面不一致。 像常规路由一样,Flask允许程序使用基于模板的自定... 查看详情
springcloud系列之自定义gatewayfilterfactory(代码片段)
SpringCloud系列之自定义GatewayFilterFactory学习目的:知道创建一个网关sample知道网关的基本配置知道自定义GatewayFilterFactory类环境准备:JDK1.8SpringBoot2.2.3SpringCloud(Hoxton.SR7)Maven3.2+开发工具IntelliJIDEAsmartGit新增SpringBootInitializer项目:N 查看详情
26.qt-模型视图之自定义委托
在上一章学习 25.QT-模型视图 后,本章接着学习视图委托<span"=""src="https://images2018.cnblogs.com/blog/1182576/201806/1182576-20180615112117897-1789509195.png"> 初探自定义委托类 委托属于视图的子 查看详情
django中的admin组件之自定义组件的增删改查的完善(代码片段)
昨天我们将自定义列放在类我们自定义的Bookconfig配置类内,但是这样就写死了,因为当我们访问publish表的时候应该也有这样的自定义列,所以我们应该将我们的自定义列放在默认的配置表里面。应该怎么做? 当我们的自定... 查看详情
flask中之数据库框架和模型类一(代码片段)
Python数据库框架#pipinstallflask-sqlalchemy****数据库引擎URLMySQLmysql://username:[email protected]/databasePostgrespostgresql://username:[email protected]/databaseSQLite(Unix)sqlite:////absolute/path 查看详情
并发编程系列之自定义可以命名的线程池工厂类(代码片段)
在使用多线程时候,有时候需要记录具体是哪些业务执行的,不过按照默认的情况,是会打印pool-1-thread-1这种类型的数据,所以有时候不能确定具体哪些业务线程执行的,可以先写一个线程池sample类,运行... 查看详情
wpf之自定义滚动条(代码片段)
原文:wpf之自定义滚动条首先我们添加一个带滚动条的textbox控件:<ScrollViewerHeight="130"Width="620"VerticalScrollBarVisibility="Auto"Style="StaticResourcefor_scrollviewer"><TextBlockxml:space="preserve"Name="FtpServe 查看详情
springboot系列之自定义枚举类的数据校验注解(代码片段)
SpringBoot系列之自定义枚举类的数据校验注解业务场景:数据校验,需要对枚举类型的数据传参,进行数据校验,不能随便传参。拓展,支持多个参数的枚举数据校验在网上找到很多参考资料,所以本博客... 查看详情
django中的admin组件之自定义组件的数据展示以及自定义列(代码片段)
虽然我们基本实现了我们自定义组件stark的功能,接下来就是显示数据了。今天我们先来写查。先来写表单部分我们如果需要显示我们自己配置类中的字段,应该怎么做呢?我们有这样一个想法,将这些数据放在一个列表中,类... 查看详情
flask开发微电影网站(代码片段)
...传文件,cookie获取与响应,404处理3.使用模板自动转义,定义过滤器,定义全局上下文处理器,Jinja2语法,包含,继承,定义宏4.使用flask-wtf定义表单模型,字段类型,字段验证,视图处理表单,模板使用表单5.使用flask-sqlachemy定... 查看详情
drf之自定义权限(代码片段)
1、增加表字段:fromdjango.dbimportmodelsclassUserInfo(models.Model):username=models.CharField(max_length=32)password=models.CharField(max_length=32)email=models.CharField(max_length=64)user_type_choices=((0, 查看详情
mapreduce之自定义combiner(代码片段)
概述Combinar继承了`Reducer`, 可选过程,在map端的实现分组(是在map端运行的reduce),减小网络IO传输; 使用Combiner需要满足的条件Combiner不能影响最终计算结果例如求平均值就不能使用Combiner输出k-v类型必须与map输出一致自定义过... 查看详情
flask从入门到精通之模型定义
...型提供了一个基类以及一系列辅助类和辅助函数,可用于定义模型的结构。下面的实例中分别定义rules和users的模型:classRole(db.Model):__tablename__=‘roles‘id=db.column(db. 查看详情