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

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

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_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))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

水痕01

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值