首页 > 解决方案 > python - SQLAlchemy:如何获取与当前用户无关的所有项目?

问题描述

我有目的得到学生没有参加的所有CourseModel项目。学生被 接走id并且是 的一个实例StudentModel。两个表都通过一个表链接attending为多对多关系。

attending = db.Table('attending',
                     db.Column('student_id', db.Integer, db.ForeignKey('students.id')),
                     db.Column('course_id', db.Integer, db.ForeignKey('courses.id')))

class StudentModel(db.Model):
    __tablename__ = "students"
    id = db.Column(db.Integer, primary_key=True)
    first_name = db.Column(db.String())
    last_name = db.Column(db.String())
    courses = db.relationship('CourseModel', secondary=attending, backref=db.backref('students_on_course', lazy='dynamic'))

class CourseModel(db.Model):
    __tablename__ = "courses"
    id = db.Column(db.Integer, primary_key=True)
    course_name = db.Column(db.String(), unique=True)
    description = db.Column(db.Text())

例如,我们有下一个数据:

      CourseModel                     attending
    ----------------            ----------------------
    id   course_name            student_id   course_id
    ----------------            ----------------------
     1   Biology                    1            1
     2   Math                       1            3
     3   Philosophy
     4   Design

学生的结果id == 1应该是 [(2, "Math"), (4, "Design")]

我很抱歉没有展示我尝试过的所有解决方案,因为它们有很多,但没有一个能让我更接近我的目标。我的主要概念如下。

available_courses = (db.session
                     .query(CourseModel)
                     .join(attending)
                     .join(StudentModel)
                     .filter(StudentModel.id == student_id)
                     .where(StudentModel.courses is None)  # can't find working condition for this place
                     )

标签: pythonsqlalchemymany-to-many

解决方案


您可以使用子查询来收集参加过的课程,然后在过滤器中使用它来获取缺失的课程:

from sqlalchemy.sql import select, not_
attended_courses_subq = select(attending.c.course_id).filter(attending.c.student_id == 1)
available_courses = session.query(CourseModel).filter(not_(CourseModel.id.in_(attended_courses_subq))).all()

推荐阅读