Изберете много към много с 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'



РЕДАКТИРАНЕ
Успях да получа класовете, но без клаузата 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
Здравей @TNT. Вашият код работи, което означава, че моят модел може би също работи? Но работата е там, че искам клаузата select 'in', за да избера всички ученици с идентификатор на клас, например 1 и 2. И както виждам, вашето предложение също е присъединяване към класовете. Както потребител 1 има 2 класа, така че в users_classes ще отпечата полето с всичките му класове. Искам да отпечата 2 различни реда от едно и също лице, като последния пример, който публикувах. Но оценявам помощта, която предложихте досега. - person Sigils; 08.01.2015
comment
здравей @TNT. Вижте последната ми редакция. Успях да получа класовете, но без клаузата in. - person Sigils; 08.01.2015
comment
Не съм сигурен какво имате предвид с in clause. Вашият проблем решен ли е или имате нужда от код, който показва резултатите? - person TNT; 08.01.2015
comment
Да, вашето кодиране ми помогна да постигна правилния резултат, така че гласувам за него като отговор! Ти ми помогна как да избера много-много данни! - person Sigils; 08.01.2015