Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 烧瓶+;SqlAlchemy从另一个类属性检索类对象_Python_Database_Flask_Sqlalchemy_Relationship - Fatal编程技术网

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,非常感谢你指出那个问题。我已经设法解决了我的问题是阅读答案!