2016-08-17 4 views
1

Предположим, что у нас есть две таблицы, связанные отношениями «многие ко многим».Извлечение коллекции внутри подзапроса

class Student(db.Model): 
    id = db.Column(UUIDType, primary_key=True) 
    name = db.Column(db.String(255)) 
    courses = db.relationship('Course', 
           secondary=student_courses, 
           backref=db.backref('students')) 


class Course(db.Model):  
    id = db.Column(UUIDType, primary_key=True) 
    name = db.Column(db.String(255)) 

Я пытаюсь запросить имя студентов с названиями курсов s/он подписался на использование подзапроса, но это только показывает название первого согласующего курса (не все из них) , Другими словами, я хотел бы получить (student_id, student_name, [list of course_names]).

sq = db.session.query(Student.id.label('student_id'), 
         Course.id.label('course_id'), 
         Course.name.label('course_name')) \ 
       .join(Student.courses) \ 
       .group_by(Student.id, Course.id).subquery('pattern_links_sq') 

db.session.query(Student.id, Student.name, sq.c.course_name) \ 
      .join(Student.courses) 
      .filter(Student.id == sq.c.student_id).all() 
+0

, какую базу данных вы используете? –

+0

Я использую Postgresql. – Edouard

ответ

0

Вы можете использовать функцию array_agg в PostgreSQL

from sqlalchemy import func 

db.session.query(Student.id, Student.name, func.array_agg(Course.name))\ 
      .join(Student.courses)\ 
      .group_by(Student.id)\ 
      .all() 
Смежные вопросы