Flask之自定義模型類

4.3自定義模型類html

定義模型

模型表示程序使用的數據實體,在Flask-SQLAlchemy中,模型通常是Python類,繼承自db.Model,db是SQLAlchemy類的實例,表明程序使用的數據庫。mysql

類中的屬性對應數據庫表中的列。id爲主鍵,是由Flask-SQLAlchemy管理。db.Column類構造函數的第一個參數是數據庫列和模型屬性類型。sql

以下示例:定義了兩個模型類,做者和書名。

#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:mysql@127.0.0.1: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:mysql@localhost/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='xihongshi@163.com')
    au_qian = Author(name='蕭潛',email='xiaoqian@126.com')
    au_san = Author(name='唐家三少',email='sanshao@163.com')
    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>

 

添加數據後,查看數據:

相關文章
相關標籤/搜索