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

我正在使用flask构建SqlAlchemy应用程序,我想从author对象本身的Notification对象中检索Notification ,而不是将所有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 = ?

在路线中,我总是将notifications中的current_user解析为参数,因为我在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))

但是,我不想解析数据库中的所有Users以便从每个通知中获取作者信息,而是想从Notification对象本身访问模板中的author User对象,如下所示:

app/templates/index.html

{{ notification.author.username }}

这应该返回其用户名。

要实现这一目标,我需要做什么样的关系或技巧?

P.S:以某种方式在用户(通知recipient)中以某种方式是不安全的,是否可以利用它来访问author中不需要的数据,例如nothification.author.password_hash?如果是这样,什么是实现我正在尝试的最佳方法?

编辑

为澄清这个问题,正如@noslenkwah指出的那样,我想明确指出authorUser,希望我可以创建一个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_idid的{​​{1}},是唯一标识符,其Userprimary key也是唯一标识符。 我也可以some_author_username,而filter_by(id=some_author_id)some_author_id的{​​{1}}也是User标识符。

etric520 回答:Flask + SqlAlchemy从另一个类属性检索一个类对象

由于@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])
本文链接:https://www.f2er.com/3121974.html

大家都在问