1. 程式人生 > >使用flask-sqlalchemy建立一對多的關係表

使用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:[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))