【问题标题】:Select many to many with Flask-SQLAlchemy使用 Flask-SQLAlchemy 选择多对多
【发布时间】:2015-01-07 14:06:12
【问题描述】:

我正在尝试使用 Flask-SQLAlchemy 从数据库中选择一些数据。但是,我正在努力获取正确的数据并加入多对多。

我的模型看起来像这样。

class User(UserMixin, db.Model):
    id = db.Column(db.Integer, primary_key=True)
    user_firstName = db.Column(db.String(64))
    ...
    role_id = db.Column(db.Integer, db.ForeignKey('role.role_id'))


class Role(db.Model):
    role_id = db.Column(db.Integer, primary_key=True)
    role_name = db.Column(db.String(64), unique=True)
    users = db.relationship('User', backref='role')

然后是我想用多对多获得的表格
注意使用 backref

class Class(db.Model):
    class_id = db.Column(db.Integer, primary_key=True)
    class_name = db.Column(db.String(128), unique=True)
    mm_children = db.relationship('User', secondary=student_identifier, backref=db.backref('classes'))

这里是保存多对多信息的表(用户和类之间的链接)

student_identifier = db.Table('student_identifier',
    db.Column('class_id', db.Integer, db.ForeignKey('class.class_id')),
    db.Column('id', db.Integer, db.ForeignKey('user.id'))
)

假设我的数据库中有这个

User
id          user_firstName  role_id
1           'John'          3
2           'Jane'          3
3           'Jack'          1
4           'Jimmy'         3
5           'Jana'          2


Role
role_id     role_name
1           'Admin'
2           'Teacher'
3           Student'


Class
class_id    class_name
1           'A'
2           'B'
3           'C'

student_identfier
class_id    id
1           1
1           2
2           2
3           1
1           4

student_identfier
class_id        id
1               1
1               2
2               2
3               1
1               4

那么如果你想循环所有类 id 为 1 和 2 的类。并获取它们的名称

id      class_name   role_name
1       'A'          'Student'
2       'A'          'Student'

2       'B'          'Student'



编辑
我设法获得了课程,但没有 in 子句。

db.session.query(
    User.user_fistName,
    Role.role_name,
    Class.class_name
).join(Role).filter_by(role_name='Student').filter(User.classes)

【问题讨论】:

    标签: python flask sqlalchemy flask-sqlalchemy


    【解决方案1】:

    如果您的模型和关系有效,您应该能够执行以下操作:

    users = session.query(User).all()
    for user in users:
        users_classes = ','.join([c.class_name for c in user.classes])
        print("{0} is {1} in {2}".format(user.user_firstName,
                                         user.role.role_name,
                                         users_classes))
    

    希望这会有所帮助。

    【讨论】:

    • 你好@TNT。您的代码正在运行,这意味着我的模型可能也在运行?但问题是我想要 select 'in' 子句,选择所有具有班级 id 的学生,例如 1 和 2。我看到你的建议也是加入课程。就像用户 1 有 2 个类一样,所以在 users_classes 中它将打印包含他所有类的字段。我希望它由同一个人打印 2 行不同的行,就像我发布的最后一个示例一样。但我感谢您迄今为止所建议的帮助。
    • 嗨@TNT。看看我最新的编辑。我设法获得了课程,但没有 in 子句。
    • 我不确定您所说的 in 子句 是什么意思。您的问题解决了吗,还是需要显示结果的代码?
    • 是的,您的编码帮助我获得了正确的结果,所以我将其投票作为答案!你帮我如何选择多对多数据!
    猜你喜欢
    • 2021-11-22
    • 2022-11-05
    • 2017-05-04
    • 2020-06-10
    • 2018-09-23
    • 2018-09-07
    • 2015-05-27
    • 2014-09-26
    • 2014-10-29
    相关资源
    最近更新 更多