使用flask-sqlalchemy建立一對多的關係表
阿新 • • 發佈:2019-01-07
本案例中是一個使用者註冊的案例,其中涉及到興趣愛好這個複選框的,處理方式就是建立一個興趣愛好表,使使用者表(一)對興趣愛好表(多)的方式儲存
index.html
程式碼
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>使用者註冊</title>
<link rel="stylesheet" href="{{ url_for('static',filename='./css/bootstrap.css ') }}">
</head>
<body>
<div class="container">
<div class="col-md-5">
<form role="form" action="" method="post">
<fieldset>
<legend class="text-center text-primary">使用者註冊頁面</legend>
<div class ="form-group">
<label>使用者名稱:</label>
<input type="text" name="name" placeholder="請輸入使用者名稱" class="form-control"/>
</div>
<div class="form-group">
<label>密碼:</label>
<input type="text" name="password" placeholder="請輸入密碼" class="form-control"/>
</div>
<div class="form-group">
<label>選擇你的性別:</label>
<div>
<label class="checkbox-inline" style="padding-left: 0;">
<input type="radio" name="sex" value="男"> 男
</label>
<label class="checkbox-inline" style="padding-left: 0;">
<input type="radio" name="sex" value="女"> 女
</label>
</div>
</div>
<div class="form-group">
<label for="">選擇你的興趣愛好:</label>
<div>
<label class="checkbox-inline">
<input type="checkbox" name="hobby" value="學習"/> 學習
</label>
<label class="checkbox-inline">
<input type="checkbox" name="hobby" value="美女"/> 妹子
</label>
<label class="checkbox-inline">
<input type="checkbox" name="hobby" value="遊戲"/> 遊戲
</label>
<label class="checkbox-inline">
<input type="checkbox" name="hobby" value="電話"/> 電視
</label>
</div>
</div>
<div class="form-group">
<label>請選擇省份:</label>
<select class="form-control" name="province">
<option value="廣東省">廣東省</option>
<option value="湖南省">湖南省</option>
<option value="廣西省">廣西省</option>
<option value="福建省">福建省</option>
</select>
</div>
<div class="form-group">
<input type="submit" value="註冊" class="btn btn-primary"/>
</div>
</fieldset>
</form>
</div>
</div>
</body>
</html>
python程式碼
#coding:utf-8;
from flask import Flask,render_template
import flask
from flask_sqlalchemy import SQLAlchemy
import config
app = Flask(__name__)
app.debug = True
#新增配置檔案
app.config.from_object(config)
#建立flask-sqlalchemy與flask的關於
db = SQLAlchemy(app)
#建立使用者的模型
class AddUser(db.Model):
__tablename__ = "add_user"
user_id = db.Column(db.Integer,primary_key=True,autoincrement=True)
user_name = db.Column(db.String(100))
user_password = db.Column(db.String(100))
user_sex = db.Column(db.String(50))
user_province = db.Column(db.String(100))
"""
由於興趣愛好是多選的,那麼就建立一個使用者與興趣愛好的一對多的關係表
"""
class Hobby(db.Model):
hobby_id = db.Column(db.Integer,primary_key=True,autoincrement=True)
hobby_name = db.Column(db.String(100))
#建立一個外來鍵,型別要跟主表一樣的,通過db.ForeignKey("add_user.user_id")與主表繫結
user_id = db.Column(db.Integer,db.ForeignKey("add_user.user_id"))
#user表示可以根據Hobby中的興趣愛好查詢到使用者表中的資訊,backref="hobbys"表示使用者表可以直接通過hobbys查詢到該使用者下的興趣愛好
user = db.relationship("AddUser",backref="hobbys")
#建立表
db.create_all()
@app.route('/',methods=["GET","POST"])
def index():
if flask.request.method == "GET":
return render_template("index.html")
else:
#獲取使用者輸入資訊
name = flask.request.form.get('name')
password = flask.request.form.get('password')
sex = flask.request.form.get('sex')
hobby = flask.request.form.getlist('hobby')
province = flask.request.form.get('province')
#先查詢是否有該使用者
search_user = db.session.query(AddUser).filter(AddUser.user_name == name).first()
print name, password, sex, hobby, province,search_user
if search_user:
return u'使用者已經註冊,不能重複註冊'
else:
search_user = AddUser(user_name=name, user_password=password, user_sex=sex, user_province=province)
for item in hobby:
hobby = Hobby(hobby_name=item)
hobby.user = search_user
db.session.add(hobby)
db.session.commit()
return u'註冊成功'
if __name__ == '__main__':
app.run()
config.py
配置檔案程式碼
#coding:utf8
DB_URI = "mysql+mysqldb://root:[email protected]:3306/python-demo?charset=utf8"
SQLALCHEMY_DATABASE_URI = DB_URI
SQLALCHEMY_TRACK_MODIFICATION = False
補充說明
- 我們可以在建立資料後跳轉到檢視剛剛建立資料資訊,涉及到查詢資料的問題
user_info.html
頁面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>使用者註冊資訊表</title>
<link rel="stylesheet" href="{{ url_for('static',filename='./css/bootstrap.css') }}">
</head>
<body>
<div class="container">
<table class="table table-striped">
<thead>
<tr>
<th>No.</th>
<th>使用者名稱</th>
<th>密碼</th>
<th>性別</th>
<th>興趣愛好</th>
<th>省份</th>
</tr>
</thead>
<tbody>
<tr>
<td>{{ user.user_id }}</td>
<td>{{ user.user_name }}</td>
<td>{{ user.user_password }}</td>
<td>{{ user.user_sex }}</td>
<td>
{% for item in hobby%}
<span>{{ item.hobby_name }}</span>,
{% endfor %}
</td>
<td>{{ user.user_province }}</td>
</tr>
</tbody>
</table>
</div>
</body>
</html>
新增一個檢視路由
@app.route("/user_info/<string:username>")
def user_info(username):
print username
user = db.session.query(AddUser).filter(AddUser.user_name == username).first()
# 根據查詢的使用者id去查詢興趣愛好
dataSet = {
"user":user,
"hobby":user.hobbys
}
return render_template('user_info.html',**dataSet)
修改下上面的index路由頁面
重定向到新的頁面上
return redirect(url_for('user_info',username=name))