Flask + SqlAlchemy 从另一个 class 属性中检索一个 class 对象

Flask + SqlAlchemy retrieve a class object from another class attribute

我正在使用 SqlAlchemy 构建一个 flask 应用程序,我想从 NotificationNotification 对象中检索 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_idUserid,是唯一标识符,它的primary keysome_author_username也是唯一标识符。 我也可以 filter_by(id=some_author_id),而 some_author_id 将是 Userprimary keyunique 标识符。

感谢@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])