您的位置:首页 > 数据库

使用flask-sqlalchemy创建一对多的关系表

2017-03-15 12:24 274 查看

本案例中是一个用户注册的案例,其中涉及到兴趣爱好这个复选框的,处理方式就是创建一个兴趣爱好表,使用户表(一)对兴趣爱好表(多)的方式存储

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:root@localhost: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))
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  存储