Sqlalchemy 从自参考多对多关系表中选择所需值时需要建议
我在flask SQLAlchemy中有以下自参考多对多模型,但无法返回SQL查询中提供的所有列值。 请有人建议:Sqlalchemy 从自参考多对多关系表中选择所需值时需要建议,sqlalchemy,flask-sqlalchemy,Sqlalchemy,Flask Sqlalchemy,我在flask SQLAlchemy中有以下自参考多对多模型,但无法返回SQL查询中提供的所有列值。 请有人建议: 如何在下面提供的代码中返回经理姓名 如果可以按特定的管理器(或)筛选输出行,则只能使用联接 以下是我的模型: # Users will act as both users/employees and also manager class Users(db.Model): id = db.Column(db.Integer, primary_key=True) username =
# Users will act as both users/employees and also manager
class Users(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(20), unique=True, nullable=False)
managers = db.relationship('Users',
secondary = association_table,
primaryjoin=id == association_table.c.user_id,
secondaryjoin=id == association_table.c.manager_id,
backref=db.backref('employees', lazy='dynamic'))
user_subs = db.relationship('Submissions', backref='sub_created_user', lazy='dynamic')
def __repr__(self):
return f"Name: {self.username}"
# association table to relate user-manager m:m relationship
association_table = db.Table('approvals', db.Model.metadata,
db.Column('user_id', db.Integer, db.ForeignKey('users.id')),
db.Column('manager_id', db.Integer, db.ForeignKey('users.id')))
# User submissions will be stored here
class Submissions(db.Model):
id = db.Column(db.Integer, primary_key=True)
submission_name = db.Column(db.String(10))
user_id = db.Column(db.Integer, db.ForeignKey('users.id'))
我想显示用户提交的所有内容以及他们的经理姓名。下面的代码为我提供了除经理姓名以外的所有信息-它作为类返回
for s in Submissions.query.all():
print(f"Submission: {s.submission_name} by User: {s.sub_created_user.username} whose Manager:{s.sub_created_user.managers}")
输出:
INFO sqlalchemy.engine.base.Engine ()
Submission: Sub1 by User: B whose Manager:[Name: A]
Submission: Sub2 by User: C whose Manager:[Name: B]
Submission: Sub3 by User: F whose Manager:[Name: E, Name: D]
所需的SQL:
感谢您的反馈 即使在多次尝试之后,我也无法正确选择“managers”对象。所以我在数据库中创建了一个“用户”作为“管理者”的视图,并将其用作SQLAlchemy中的“管理者”模型,现在我能够准确地检索到我想要的信息。由于这不是确切的答案,我将其作为评论发布
select submissions.submission_name, users.username as user_name, managers.username as manager_name
from submissions join users
on submissions.user_id = users.id
join approvals
on users.id = approvals.user_id
join users as managers
on approvals.manager_id = managers.id
order by users.username, submission_name, managers.username