2015-01-07 6 views
1

Я пытаюсь выбрать некоторые данные из базы данных с помощью 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') 

, а затем таблицу я хочу, чтобы многие ко многим
записки с использованием 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 

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

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

2  'B'   'Student' 



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

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

ответ

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

Надеется, что это помогает.

+0

Hello @TNT. Ваш код работает, а это значит, что моя модель тоже работает? Но дело в том, что я хочу выбрать предложение «in», чтобы выбрать всех учеников с идентификатором класса, например 1 и 2. И, как я вижу, ваше предложение также присоединяется к классам. Как и пользователь 1 имеет 2 класса, поэтому в 'users_classes' он будет печатать поле со всеми его классами. Я хочу, чтобы он печатал 2 разных строки одним и тем же человеком, как и последний пример, который я опубликовал. Но я ценю помощь, которую вы предложили до сих пор. – Sigils

+0

привет @ TNT. Посмотрите мое последнее редактирование. Мне удалось получить классы, но без предложения. – Sigils

+0

Я не уверен, что вы имеете в виду с * в пункте *. Ваша проблема решена или вам нужен код, который отображает результаты? – TNT

Смежные вопросы