Python SqlAlchemy:我想对2个外键进行过滤查询
我有两个表(比如Python SqlAlchemy:我想对2个外键进行过滤查询,python,python-3.x,sqlalchemy,flask-sqlalchemy,Python,Python 3.x,Sqlalchemy,Flask Sqlalchemy,我有两个表(比如Student和College),第三个表有Student\u id和College\u id外键 我不想硬删除Student和College行,因此我在两个表中都包含了deleted(Boolean)列 我想将学生添加到学院(通过将student\u id和college\u id添加到第三个表)。我首先要检查该学生是否已经存在于学院中,同时还要过滤已删除的学生和学院记录 我写的第一部分是: db.session.query(StudentCollegeMappingModel
Student
和College
),第三个表有Student\u id
和College\u id
外键
我不想硬删除Student
和College
行,因此我在两个表中都包含了deleted(Boolean)
列
我想将学生添加到学院(通过将student\u id
和college\u id
添加到第三个表)。我首先要检查该学生是否已经存在于学院中,同时还要过滤已删除的学生和学院记录
我写的第一部分是:
db.session.query(StudentCollegeMappingModel).filter(
StudentCollegeMappingModel.student_id==student_id,
StudentCollegeMappingModel.college_id==college_id
).first()
但我也想看看
Student.deleted==False and College.deleted==False
我该怎么做呢?您需要将
学生
和学院
表加入到您的查询中,以便可以筛选已删除的
列:
query = (
StudentCollegeMappingModel.query
.join(Student, Student.id == StudentCollegeMappingModel.student_id)
.join(College, College.id == StudentCollegeMappingModel.college_id)
.filter(
StudentCollegeMappingModel.student_id == student_id,
StudentCollegeMappingModel.college_id == college_id,
Student.deleted.is_(False),
College.deleted.is_(False),
)
)
我使用了StudentCollegeMappingModel.query
而不是db.session.query(StudentCollegeMappingModel)
;它们产生相同的初始Query
实例,但是Flask SQLAlchemy通过给您.Query
属性来让您更容易
如果您将Student\u id
和College\u id
配置为ForeignKey(),则可能可以省略Student.id==StudentCollegeMappingModel.Student.id==StudentCollegeMappingModel.Student\u id=/code>和College.id==studentcollegegemappingmodel.College\u id
ON
子句
列,并且表之间没有可能混淆SQLAlchemy的其他关系:
query = (
StudentCollegeMappingModel.query.join(Student).join(College)
.filter(
StudentCollegeMappingModel.student_id == student_id,
StudentCollegeMappingModel.college_id == college_id,
Student.deleted.is_(False),
College.deleted.is_(False),
)
)
您还可以使用:
请注意,插入新记录时,可以将上述查询用作不存在
过滤器;这将有助于防止争用情况(多段代码尝试进行相同的更改,或者一些代码在测试后但在插入之前设置了已删除的列)。您可以使用连接
db.session.query(StudentCollegeMappingModel, Student, College)
.join(StudentCollegeMappingModel)
.join(Student)
.join(College)
.filter(StudentCollegeMappingModel.student_id == Student.id, StudentCollegeMappingModel.college_id==college_id,Student.deleted==False, College.deleted==False)
).all()
你配置了表之间的关系了吗?你能分享一下你的模型定义吗?@MartijnPieters我看到一个会话。查询问题不是模型问题。Whatsoever@KostasCharitidis:这与问题无关,真的。StudentCollegeMappingModel.query
或db.session.query(学生学院应用模型)
只是在使用Flask SQLAlchemy时创建初始查询对象的两种方法。这与您的“使用多个过滤器”注释有什么关系?我看到了True
和False
的别名,以前使用=
和linters混在一起,但不知道表达式函数。我喜欢这样,谢谢!
db.session.query(StudentCollegeMappingModel, Student, College)
.join(StudentCollegeMappingModel)
.join(Student)
.join(College)
.filter(StudentCollegeMappingModel.student_id == Student.id, StudentCollegeMappingModel.college_id==college_id,Student.deleted==False, College.deleted==False)
).all()