摘要:承接上文,我們的,除了用戶表,還需要存儲所有問題內(nèi)容的表和存儲所有評論的表,并且都和通過外鍵來關聯(lián)。我們不排除后續(xù)需要更多表的可能性,把所有模型和視圖函數(shù)寫在一起看著也太混亂了為此,我們新建一個,把三個模型都放在這里。
承接上文,我們的Q&A demo,除了用戶表,還需要存儲所有問題內(nèi)容的表questions_info和存儲所有評論的表comments_info,并且都和users_info通過外鍵來關聯(lián)。我們不排除后續(xù)需要更多表的可能性,把所有模型和視圖函數(shù)寫在一起看著也太混亂了!為此,我們新建一個models.py,把三個模型都放在這里。
由于是新建的models.py文件,我們同樣要先在開頭生成一個名為db的SQLAlchemy對象:
from flask_sqlalchemy import SQLAlchemy db = SQLAlchemy()
前文中我們給SQLAlchemy傳入了Flask對象app作為參數(shù),這里是不是也要從視圖函數(shù)文件HarpQA.py導入那個app并傳進去呢?并不可以,因為HarpQA.py也要使用到db(如db.session),這樣就產(chǎn)生了循環(huán)引用,所以在這里不能傳入app,而是回到HarpQA.py,使用db.init_app(app)將app和db綁定,避免了循環(huán)引用。
users_info表(Users模型)代碼如下:
class Users(db.Model): __tablename__ = "users_info" id = db.Column(db.Integer, primary_key=True, autoincrement=True) username = db.Column(db.String(32), nullable=False) password = db.Column(db.String(100), nullable=False) register_time = db.Column(db.DateTime, nullable=False, default=datetime.now()) # 我們新增了一個avatar_path字段來存用戶頭像圖片文件的路徑 avatar_path = db.Column(db.String(256), nullable=False, default="images/doraemon.jpg")
questions_info表(Questions模型)代碼如下:
class Questions(db.Model): __tablename__ = "questions_info" id = db.Column(db.Integer, primary_key=True, autoincrement=True) title = db.Column(db.String(100), nullable=False) content = db.Column(db.TEXT, nullable=False) author_id = db.Column(db.Integer, db.ForeignKey("users_info.id")) create_time = db.Column(db.DateTime, nullable=False, default=datetime.now()) author = db.relationship("Users", backref=db.backref("questions", order_by=create_time.desc()))
這個表存儲所有問題的標題、內(nèi)容、創(chuàng)建時間、作者ID,作者ID通過外鍵與用戶表的ID關聯(lián),方式也很簡單,在db.Column中用db.ForeignKey("users_info.id")作為參數(shù)即可。
再看最后一條語句:
author = db.relationship("Users", backref=db.backref("questions", order_by=create_time.desc()))
db.relationship會自動找到兩個表的外鍵,建立Questions和Users的關系,此時對于任意一個Questions對象question,通過question.author就可獲得這個question的作者對應的Users對象,例如獲取id為1的問題的作者姓名:
question = Questions.query.filter(Questions.id == 1).first() author_name = question.author.username
db.relationship的第二個參數(shù)backref=db.backref("questions", order_by=create_time.desc())則建立了一個反向引用,這樣我們不僅可以使用question.author,還可以使用author.questions獲得一個作者所有的問題,并通過order_by=create_time.desc()按創(chuàng)建時間倒序排列(網(wǎng)頁的內(nèi)容按時間倒序排列),返回的是一個Questions對象的列表,可以遍歷它獲取每個對象,如獲取作者Harp的所有問題的title:
author = Users.query.filter(Users.username == "Harp").first() for question in author.questions: print(question.title)
同理,comments_info表(Comments模型)代碼如下:
class Comments(db.Model): __tablename__ = "comments_info" id = db.Column(db.Integer, primary_key=True, autoincrement=True) content = db.Column(db.TEXT, nullable=False) question_id = db.Column(db.Integer, db.ForeignKey("questions_info.id")) author_id = db.Column(db.Integer, db.ForeignKey("users_info.id")) create_time = db.Column(db.DateTime, nullable=False, default=datetime.now()) author = db.relationship("Users", backref=db.backref("comments")) question = db.relationship("Questions", backref=db.backref("comments", order_by=create_time.desc()))
在HarpQA.py中,我們要從models.py導入db及所有的模型,注意因為上下文的關系,我們這里用with語句把app推入棧中:
from flask import Flask, render_template from models import db, Users, Questions, Comments import config app = Flask(__name__) app.config.from_object(config) db.init_app(app) with app.test_request_context(): db.drop_all() db.create_all() @app.route("/") def index(): return render_template("home.html") if __name__ == "__main__": app.run()
運行腳本,此時數(shù)據(jù)庫已經(jīng)把三張表都建立好了:
文章版權歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/41230.html
摘要:本節(jié)圍繞在中如何定義關系及如何使用關系進行查詢進行講解,使讀者能夠快速掌握的關系操作。班級與學生為一對多關系,班級與老師之間為多對多關系。三年二班多對多關系的使用通過關聯(lián)模型實現(xiàn),在其中分別設置模型和的外鍵,并且在父模型中設置相應的實現(xiàn)。 上一篇文章:Python-SQLAlchemy:第2節(jié):查詢條件設置下一篇文章:Python-SQLAlchemy:第4節(jié):級聯(lián) 關系數(shù)據(jù)庫是建立...
摘要:數(shù)據(jù)庫關系數(shù)據(jù)庫將數(shù)據(jù)保存在表中來模擬應用程序中不同的實體。這些行之間的連接稱作關系,也是關系數(shù)據(jù)庫模型的基礎。就像這個示例中看到的那樣,關系數(shù)據(jù)庫存儲數(shù)據(jù)高效且避免重復。最好的例子就是,支持一組關系數(shù)據(jù)庫引擎,包括流行的和。 數(shù)據(jù)庫就是有組織的存儲應用程序數(shù)據(jù),然后查詢檢索指定需要的那部分。大部分web應用程序都采用基于關系模型的數(shù)據(jù)庫,也稱作結構化查詢語言(SQL)數(shù)據(jù)庫。但是最近...
摘要:發(fā)布問答界面與功能以及完成了,我們要把用戶發(fā)布的內(nèi)容在首頁展示出來,邏輯也是很簡單,在請求的時候,從中獲取所有的數(shù)據(jù),在中使用循環(huán)將每一個對象的內(nèi)容寫上去。 發(fā)布問答界面與功能以及完成了,我們要把用戶發(fā)布的內(nèi)容在首頁展示出來,邏輯也是很簡單,在請求home.html的時候,從Questions中獲取所有的數(shù)據(jù),在home.html中使用for循環(huán)將每一個對象的內(nèi)容寫上去。將home視圖...
摘要:數(shù)據(jù)庫關系數(shù)據(jù)庫將數(shù)據(jù)保存在表中來模擬應用程序中不同的實體。這些行之間的連接稱作關系,也是關系數(shù)據(jù)庫模型的基礎。就像這個示例中看到的那樣,關系數(shù)據(jù)庫存儲數(shù)據(jù)高效且避免重復。最好的例子就是,支持一組關系數(shù)據(jù)庫引擎,包括流行的和。 數(shù)據(jù)庫就是有組織的存儲應用程序數(shù)據(jù),然后查詢檢索指定需要的那部分。大部分web應用程序都采用基于關系模型的數(shù)據(jù)庫,也稱作結構化查詢語言(SQL)數(shù)據(jù)庫。但是最近...
閱讀 3042·2023-04-25 19:08
閱讀 1498·2021-11-16 11:45
閱讀 2138·2021-10-13 09:40
閱讀 4320·2021-09-30 09:47
閱讀 2494·2019-08-30 15:44
閱讀 2450·2019-08-30 13:03
閱讀 1449·2019-08-30 12:56
閱讀 1952·2019-08-26 14:04