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()