Python 烧瓶+;SqlAlchemy从另一个类属性检索类对象
我正在使用Python 烧瓶+;SqlAlchemy从另一个类属性检索类对象,python,database,flask,sqlalchemy,relationship,Python,Database,Flask,Sqlalchemy,Relationship,我正在使用SqlAlchemy构建一个flask应用程序,我想从Notification对象本身的通知对象中检索作者,而不是将所有用户解析为模板,以捕获作者的数据 以下是我的模型: 在app/models.py中 from app import db from datetime import datetime #... class User(db.Model): id = db.Column(db.Integer, primary_key=True) username = d
SqlAlchemy
构建一个flask
应用程序,我想从Notification
对象本身的通知
对象中检索作者
,而不是将所有用户
解析为模板
,以捕获作者
的数据
以下是我的模型:
在app/models.py中
from app import db
from datetime import datetime
#...
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(250), unique=True, index=True)
password_hash = db.Column(db.Binary(72))
notifications = db.relationship('Notification', backref='recipient', lazy='dynamic')
#...
class Notification(db.Model):
id = db.Column(db.Integer, primary_key=True)
body = db.Column(db.String(140))
timestamp = db.Column(db.DateTime, index=True, default=datetime.utcnow)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
pending = db.Column(db.Boolean, default=True)
author = ?
@app.route('/')
@app.route('/index')
def index():
notifications = User.query.filter_by(id=current_user.id).first().notifications.all()
else:
notifications = []
return(render_template('index.html', title=_('Home'), notifications=notifications))
from app import db
from sqlalchemy.orm import backref
from datetime import datetime
#...
class Notification(db.Model):
__tablename__ = 'notification'
id = db.Column(db.Integer, primary_key=True)
body = db.Column(db.String(140))
timestamp = db.Column(db.DateTime, index=True, default=datetime.utcnow)
pending = db.Column(db.Boolean, default=True)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
author_id = db.Column(db.Integer, db.ForeignKey('user.id'))
recipient = db.relationship(User, foreign_keys=[user_id],
backref=backref('notifications', order_by=id, lazy='dynamic'))
author = db.relationship(User, foreign_keys=[author_id])
在我的路径中,我总是将来自当前用户的通知作为参数进行解析,因为我在模板/base.html
导航栏中使用它(以及我的所有视图{%extensed“base.html%}
)
以下是一个路线示例:
在app/routes.py中
from app import db
from datetime import datetime
#...
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(250), unique=True, index=True)
password_hash = db.Column(db.Binary(72))
notifications = db.relationship('Notification', backref='recipient', lazy='dynamic')
#...
class Notification(db.Model):
id = db.Column(db.Integer, primary_key=True)
body = db.Column(db.String(140))
timestamp = db.Column(db.DateTime, index=True, default=datetime.utcnow)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
pending = db.Column(db.Boolean, default=True)
author = ?
@app.route('/')
@app.route('/index')
def index():
notifications = User.query.filter_by(id=current_user.id).first().notifications.all()
else:
notifications = []
return(render_template('index.html', title=_('Home'), notifications=notifications))
from app import db
from sqlalchemy.orm import backref
from datetime import datetime
#...
class Notification(db.Model):
__tablename__ = 'notification'
id = db.Column(db.Integer, primary_key=True)
body = db.Column(db.String(140))
timestamp = db.Column(db.DateTime, index=True, default=datetime.utcnow)
pending = db.Column(db.Boolean, default=True)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
author_id = db.Column(db.Integer, db.ForeignKey('user.id'))
recipient = db.relationship(User, foreign_keys=[user_id],
backref=backref('notifications', order_by=id, lazy='dynamic'))
author = db.relationship(User, foreign_keys=[author_id])
但是,我不想解析数据库中的所有用户,以便从每个通知中获取作者信息,而是想从通知对象本身访问模板中的作者用户对象,如下所示:
在app/templates/index.html
{{notification.author.username}}
这应该返回它的用户名
我需要怎样的关系或技巧才能做到这一点
附言:如果用户(通知接收者
)可以利用它访问作者
的不需要的数据,例如nothination.author.password\u hash
,这会不会有任何不安全的地方?如果是这样的话,实现我尝试的最好的方法是什么
编辑
为了澄清这个问题,正如@noslenkwah所指出的,我想明确指出,作者
是一个用户
,我希望我可以通过分配以下内容来创建一个通知
对象:
notification=notification(body='example',user\u id=some\u recipient\u id,author=user.query.filter\u by(username=some\u author\u username.first())
然后我可以db.session.add(notification)
,最后db.session.commit()
it
some\u recipient\u id
是User
的id
,是唯一标识符,其主键
和某些作者的用户名
也是唯一标识符。
我也可以通过(id=some\u author\u id)
过滤,而some\u author\u id
将是用户的主键
,也是唯一的标识符。多亏@noslenkwah指向这个问题,我才能够找到一种方法来完成我想做的事情
以下是方法:
在models.py中
from app import db
from datetime import datetime
#...
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(250), unique=True, index=True)
password_hash = db.Column(db.Binary(72))
notifications = db.relationship('Notification', backref='recipient', lazy='dynamic')
#...
class Notification(db.Model):
id = db.Column(db.Integer, primary_key=True)
body = db.Column(db.String(140))
timestamp = db.Column(db.DateTime, index=True, default=datetime.utcnow)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
pending = db.Column(db.Boolean, default=True)
author = ?
@app.route('/')
@app.route('/index')
def index():
notifications = User.query.filter_by(id=current_user.id).first().notifications.all()
else:
notifications = []
return(render_template('index.html', title=_('Home'), notifications=notifications))
from app import db
from sqlalchemy.orm import backref
from datetime import datetime
#...
class Notification(db.Model):
__tablename__ = 'notification'
id = db.Column(db.Integer, primary_key=True)
body = db.Column(db.String(140))
timestamp = db.Column(db.DateTime, index=True, default=datetime.utcnow)
pending = db.Column(db.Boolean, default=True)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
author_id = db.Column(db.Integer, db.ForeignKey('user.id'))
recipient = db.relationship(User, foreign_keys=[user_id],
backref=backref('notifications', order_by=id, lazy='dynamic'))
author = db.relationship(User, foreign_keys=[author_id])
作者是什么?是一个用户
?作者是如何确定的?当创建通知
对象时,可以很容易地定义它吗?嗨@noslenkwah,谢谢你的提问,我将更新这个问题。作者是一个用户,我希望我可以创建一个通知对象,将作者设置为用户,或者从烧瓶外壳,通过运行not=Notification(body='something',user\u id=some\u integer,author=user.query.filter\u by(id=some\u integer)。首先())
,然后我将运行db.session.add(not)
和db.session.commit()
,或者,我将创建一条路线
,以在运行应用程序时创建一条通知
,使用自己的模板
,其中包含填充所有必需属性的字段。您可以这样做。您的答案可以在question@noslenkwah,非常感谢你指出那个问题。我已经设法解决了我的问题是阅读答案!