python - 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
)
解决方案
您可以使用子查询来收集参加过的课程,然后在过滤器中使用它来获取缺失的课程:
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()
推荐阅读
- javascript - 使用 react-navigation 无法正常运行 Jest 测试
- python - 使用带有西里尔输出的 paramiko exec_command 时如何获得正确的编码输出
- node.js - ExpressWinston 未登录 200 HTTP 响应代码
- mdriven - “在 Windows 上安装 MDriven 服务器” - 无法访问本地 Turnkey
- java - 如何使成分与从 Android Studios 输入到 Firebase 实时数据库的配方相匹配
- android - 如何在小米(MIUI 10 Global)上启用提醒通知
- java - servlet 显示 java.io.FileNotFoundException: ?E:\guru99\test.txt(文件名、目录名或卷标语法不正确)
- regex - 正则表达式在字符串开头的单个数字
- excel - 应用程序定义或对象定义的错误仅在 If Vlookup 语句中显示
- swift - 无法添加从 Button 到 ViewController 的 Outlet 连接