Flask + SqlAlchemy 从另一个 class 属性中检索一个 class 对象
Flask + SqlAlchemy retrieve a class object from another class attribute
我正在使用 SqlAlchemy
构建一个 flask
应用程序,我想从 Notification
的 Notification
对象中检索 author
对象本身,而不是将所有 User
解析为 template
以捕获 author
的数据。
这是我的模型:
在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 = ?
在我的路线中,我总是将 current_user
中的 notifications
作为参数解析,因为我在我的 templates/base.html
导航栏(以及我所有的视图 {% extends "base.html %}
)
这是一个路线示例:
在app/routes.py
@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))
但是,我不想解析数据库中的所有用户以便从每个通知中获取作者信息,而是想从通知对象本身访问模板中的作者用户对象,例如所以:
在app/templates/index.html
{{ notification.author.username }}
那应该 return 它的用户名。
我需要什么样的关系或技巧才能做到这一点?
P.S:这会不会以任何方式不安全,因为用户(通知 recipient
)可能会以某种方式利用它从 author
访问不需要的数据,例如 nothification.author.password_hash
例如?如果是这样,什么是实现我正在尝试的最佳方式?
编辑
为了澄清这个问题,正如@noslenkwah 所指出的,我想明确指出 author
是一个 User
,我希望我可以创建一个 Notification
对象的分配如下:
notification = Notification(body='example', user_id=some_recipient_id, author = User.query.filter_by(username=some_author_username).first())
然后我可以 db.session.add(notification)
最后 db.session.commit()
它。
some_recipient_id
是User
的id
,是唯一标识符,它的primary key
和some_author_username
也是唯一标识符。
我也可以 filter_by(id=some_author_id)
,而 some_author_id
将是 User
的 primary key
和 unique
标识符。
感谢@noslenkwah 指出 this 问题,我能够找到一种方法来完成我正在尝试的事情。
方法如下:
在models.py
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])
我正在使用 SqlAlchemy
构建一个 flask
应用程序,我想从 Notification
的 Notification
对象中检索 author
对象本身,而不是将所有 User
解析为 template
以捕获 author
的数据。
这是我的模型:
在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 = ?
在我的路线中,我总是将 current_user
中的 notifications
作为参数解析,因为我在我的 templates/base.html
导航栏(以及我所有的视图 {% extends "base.html %}
)
这是一个路线示例:
在app/routes.py
@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))
但是,我不想解析数据库中的所有用户以便从每个通知中获取作者信息,而是想从通知对象本身访问模板中的作者用户对象,例如所以:
在app/templates/index.html
{{ notification.author.username }}
那应该 return 它的用户名。
我需要什么样的关系或技巧才能做到这一点?
P.S:这会不会以任何方式不安全,因为用户(通知 recipient
)可能会以某种方式利用它从 author
访问不需要的数据,例如 nothification.author.password_hash
例如?如果是这样,什么是实现我正在尝试的最佳方式?
编辑
为了澄清这个问题,正如@noslenkwah 所指出的,我想明确指出 author
是一个 User
,我希望我可以创建一个 Notification
对象的分配如下:
notification = Notification(body='example', user_id=some_recipient_id, author = User.query.filter_by(username=some_author_username).first())
然后我可以 db.session.add(notification)
最后 db.session.commit()
它。
some_recipient_id
是User
的id
,是唯一标识符,它的primary key
和some_author_username
也是唯一标识符。
我也可以 filter_by(id=some_author_id)
,而 some_author_id
将是 User
的 primary key
和 unique
标识符。
感谢@noslenkwah 指出 this 问题,我能够找到一种方法来完成我正在尝试的事情。
方法如下:
在models.py
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])