简体   繁体   English

使用Flask-SQLAlchemy选择多对多

[英]Select many to many with Flask-SQLAlchemy

I am trying to SELECT some data from the database with Flask-SQLAlchemy. 我正在尝试使用Flask-SQLAlchemy从数据库中选择一些数据。 However, I am struggling getting the right data and joining with many-to-many. 但是,我正在努力获取正确的数据并与多对多连接。

My models looks like this. 我的模型看起来像这样。

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

and then the table I want to get with many to many 然后我想要很多的桌子
note using backref 注意使用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'))

and here is the table which holds the many-to-many information (the link between user and class) 这是保存多对多信息(用户和类之间的链接)的表

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

lets say I have this in my database 可以说我的数据库中有这个

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

then if you want to loop all the ones with class id 1 and 2. And get their names 然后,如果要循环所有具有类ID 1和2的对象,并获取它们的名称

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

2       'B'          'Student'



EDIT 编辑
I managed to get the classes, but without the in clause. 我设法获得了类,但是没有in子句。

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

If your models and relations work, you should be able to do something like this: 如果您的模型和关系有效,则应该能够执行以下操作:

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

Hope this helps. 希望这可以帮助。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM