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

来源:互联网 发布:f.lux for mac下载 编辑:程序博客网 时间:2024/04/27 18:44

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

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="男">&nbsp;&nbsp;男                        </label>                        <label class="checkbox-inline" style="padding-left: 0;">                            <input type="radio" name="sex" value="女">&nbsp;&nbsp;女                        </label>                    </div>                </div>                <div class="form-group">                    <label for="">选择你的兴趣爱好:</label>                    <div>                        <label class="checkbox-inline">                            <input type="checkbox" name="hobby" value="学习"/>&nbsp;&nbsp;学习                        </label>                        <label class="checkbox-inline">                            <input type="checkbox" name="hobby" value="美女"/>&nbsp;&nbsp;妹子                        </label>                        <label class="checkbox-inline">                            <input type="checkbox" name="hobby" value="游戏"/>&nbsp;&nbsp;游戏                        </label>                        <label class="checkbox-inline">                            <input type="checkbox" name="hobby" value="电话"/>&nbsp;&nbsp;电视                        </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_templateimport flaskfrom flask_sqlalchemy import SQLAlchemyimport configapp = 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:utf8DB_URI = "mysql+mysqldb://root:root@localhost:3306/python-demo?charset=utf8"SQLALCHEMY_DATABASE_URI = DB_URISQLALCHEMY_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))
0 0