Выберите многие ко многим с помощью 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.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')

а затем таблицу, которую я хочу получить с
примечанием, используя обратную ссылку

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

тогда, если вы хотите зациклить все те, у которых есть идентификатор класса 1 и 2. И получить их имена

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

2       'B'          'Student'



EDIT
Мне удалось получить классы, но без предложения in.

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

person Sigils    schedule 07.01.2015    source источник


Ответы (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))

Надеюсь это поможет.

person TNT    schedule 07.01.2015
comment
Привет @ТНТ. Ваш код работает, значит, моя модель тоже работает? Но дело в том, что я хочу, чтобы предложение select 'in' выбирало всех учеников с идентификатором класса, например 1 и 2. И, как я вижу, ваше предложение также присоединяется к классам. Например, у пользователя 1 есть 2 класса, поэтому в users_classes он напечатает поле со всеми его классами. Я хочу, чтобы он печатал 2 разные строки одним и тем же человеком, как в последнем примере, который я опубликовал. Но я ценю помощь, которую вы предложили до сих пор. - person Sigils; 08.01.2015
comment
привет @ТНТ. Посмотрите на мою последнюю правку. Мне удалось получить классы, но без предложения in. - person Sigils; 08.01.2015
comment
Я не уверен, что вы имеете в виду под в предложении. Ваша проблема решена или вам нужен код, отображающий результаты? - person TNT; 08.01.2015
comment
Да, ваш код помог мне получить правильный результат, поэтому я голосую за него как за ответ! Вы помогли мне, как выбрать много-много данных! - person Sigils; 08.01.2015