我有2个表(例如Student
和College
)和第三个表(StudentCollege
),其中有student_id
和college_id
外键。 / p>
我想从下面的查询中给出输出:
list = (
db.session.query(StudentCollegeModel.College_id)
.filter(StudentCollegeModel.student_id== student_id)
.all()
)
到以下查询:
(
db.session.query(CollegeModel)
.filter(CollegeModel.College_id.in_(list))
.all()
)
但是它给了编程错误。
答案 0 :(得分:3)
您无需执行第一个查询即可将其用作第二个查询的子查询。这使您不必在进行College_id
查询之前就构造所有in_()
的内存列表,这意味着您只需要往返数据库一次即可。
subquery = (
db.session.query(StudentCollegeModel.College_id)
.filter(StudentCollegeModel.student_id== student_id)
)
result = (
db.session.query(CollegeModel)
.filter(CollegeModel.College_id.in_(subquery))
.all()
)
答案 1 :(得分:0)
您的第一个查询返回一个命名元组列表。您需要将其转换为列表。例如:
college_tuples = db.session.query(StudentCollegeModel.College_id).filter(StudentCollegeModel.student_id == student_id).all()
college_id_list = [r.College_id for r in college_tuples]
db.session.query(CollegeModel.filter(CollegeModel.College_id.in_(college_id_list)).all()
在这里,我们获取您的大学ID元组,将其展平,然后使用展平的版本执行第二个查询。
答案 2 :(得分:0)
类似如下:
cs = StudentCollegeModel.query.filter_by(student_id=student_id).distinct('college_id').entities_with('college_id', flat=True).all()
CollegeModel.query.filter(CollegeModel.College_id.in_(cs)).all()