Python 使用炼金术选择多对多

Python 使用炼金术选择多对多,python,flask,sqlalchemy,flask-sqlalchemy,Python,Flask,Sqlalchemy,Flask Sqlalchemy,我正在尝试使用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.For

我正在尝试使用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得到的多对多
注释的表格

这是一个包含多对多信息的表(用户和类之间的链接)

假设我的数据库中有这个

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)

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

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))

希望这有帮助。

Hello@TNT。您的代码正在工作,这意味着我的模型可能也在工作?但问题是,我希望select'in'子句选择所有具有类id的学生,例如1和2。正如我所看到的,你的建议也是加入课程。与用户1一样,用户1有2个类,因此在
users\u classes
中,它将打印包含其所有类的字段。我希望它由同一个人打印两行不同的内容,就像我发布的最后一个示例一样。但我感谢你迄今为止所建议的帮助。看看我的最新编辑。我设法得到了这些类,但是没有in子句。我不知道你说的in子句是什么意思。你的问题解决了吗?或者你需要显示结果的代码吗?是的,你的代码帮助我得到了正确的结果,所以我投票作为答案!你帮我选择了很多数据!
db.session.query(
    User.user_fistName,
    Role.role_name,
    Class.class_name
).join(Role).filter_by(role_name='Student').filter(User.classes)
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))