![](/img/trans.png)
[英]database field created by a relational field in flask sqlalchemy models
[英]Adding a comments field to database with flask/SQLAlchemy?
我正在一個燒瓶應用程序上,該應用程序具有這樣設置的數據庫 並正在使用SQLAlchemy。 (display_name被重命名為persona_name,因為這就是Steam api所稱的名稱。)
我仍在學習如何使用數據庫,現在可以正常工作,可以跟蹤用戶創建的所有列表,並且可以從一個用戶創建的所有列表中尋找可疑對象。 同樣,從可疑表中刪除可疑對象似乎也將從其出現的所有列表中刪除可疑對象。
這似乎工作得很好,List和Suspect是從db.Model繼承的類,而懷疑表是本身不是類的輔助表。
設置方式我希望能夠將嫌疑人顯示在多個列表中,但是現在,我希望能夠為單個列表中的單個嫌疑人添加評論。
我不確定該怎么做,但是我有一些想法,不確定它們是否可行或有潛在的弊端。
1)我可以在comment_list中添加評論字段嗎?
2)我是否將注釋模型作為繼承自db.Model的類,然后將其添加到輔助表中?
3)我是否應該為可疑表創建一個新的id字段,使其成為主鍵而不是steam_id,然后添加一個注釋字段,以便可以有重復的具有不同注釋的可疑對象?
我可能可以實現3,但我認為這不是一個好主意,因為應該避免同一嫌疑犯的重復。
至於1和2,我不知道它們是否可以工作,如果不能,我不確定如何正確實現它們。
我的問題是如何將注釋正確地添加到已建立的該數據庫模型中?
而不是關聯表,您確實需要一個關聯對象 。 這是一個工作示例。
from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.secret_key = 'MOO.'
app.config["SQLALCHEMY_DATABASE_URI"] = 'sqlite://' # In memory.
db = SQLAlchemy(app)
class User(db.Model):
__tablename__ = 'user'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String)
def __repr__(self):
return '<User {}>'.format(self.name)
class Suspect(db.Model):
__tablename__ = 'suspect'
id = db.Column(db.Integer, primary_key=True)
steam_name = db.Column(db.String)
def __repr__(self):
return '<Suspect {}>'.format(self.steam_name)
class List(db.Model):
__tablename__ = 'list'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String())
user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
user = db.relationship('User', backref=db.backref('lists'))
suspects = db.relationship('SuspectList', backref='list')
def __repr__(self):
return '<List {}>'.format(self.name)
class SuspectList(db.Model):
__tablename__ = 'suspect_list'
list_id = db.Column(db.Integer, db.ForeignKey('list.id'), primary_key=True)
suspect_id = db.Column(db.Integer, db.ForeignKey('suspect.id'), primary_key=True)
comment = db.Column(db.String)
suspect = db.relationship('Suspect', backref=db.backref("suspect_list"))
def __repr__(self):
return '<SL: %s %s %s>' % (self.list, self.suspect, self.comment)
if __name__ == '__main__':
with app.app_context():
db.create_all()
hacker = Suspect(steam_name='Bob')
cracker = Suspect(steam_name='Alice')
carol = User(name='Carol')
carols_list = List(name='Carols', user=carol)
hacker_suspect = SuspectList(suspect=hacker, comment='RED HAIR')
cracker_suspect = SuspectList(suspect=cracker, comment='RED EYES')
carols_list.suspects.append(hacker_suspect)
carols_list.suspects.append(cracker_suspect)
db.session.add(carols_list) # Trust SQLAlchemy to add all related.
db.session.commit()
## Querying:
my_list = List.query.filter(User.name == 'Carol').first()
for record in my_list.suspects:
print '{} reported {} with comment {}'.format(
record.list.user.name,
record.suspect.steam_name,
record.comment
)
# Carol reported Bob with comment RED HAIR
# Carol reported Alice with comment RED EYES
兩個旁注-我發現將List用作類名有點丑陋,因為當您要查詢它時,默認名稱將是list = List.query.fi....
不行:)。 另外,您使用什么程序生成ERD?
如果我正確理解,我將創建一個與您的列表模型相關的新模型
class Comments(db.Model):
id = db.Column(db.Integer, primary_key=True)
comment = db.Column(db.String(300))
list_id = db.Column(db.Integer, db.ForeignKey('list.id'))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.