Python 在相关模型上过滤模型仍显示;过滤掉;相关对象

Python 在相关模型上过滤模型仍显示;过滤掉;相关对象,python,sqlalchemy,Python,Sqlalchemy,一个体育课有许多课程。我只希望能够得到可用的课程 我尝试了以下方法: sports_classes = db.session.query(SportsClass).join(Course).filter((SportsClass.description.contains(query))|(SportsClass.name.contains(query))) sports_classes = sports_classes.filter((Course.bookable == "bookable")

一个
体育课
有许多
课程
。我只希望能够得到可用的课程

我尝试了以下方法:

sports_classes = db.session.query(SportsClass).join(Course).filter((SportsClass.description.contains(query))|(SportsClass.name.contains(query)))
sports_classes = sports_classes.filter((Course.bookable == "bookable") | (Course.bookable == "waitingList"))
但是,该查询返回的结果是(转换为json并简化):


为什么取消的课程也在结果集中?我如何才能只获得每门课的可用课程?

您将加入/筛选与加载相关对象混为一谈。您当前的查询正在筛选
SportsClass
,以确保至少有一门课程是
可预订的
等待列表的
。但是,这并不影响关系加载的内容,关系与加载查询结果是分开处理的

相反,您可能希望第二个关系只显示未取消的类。然后将该关系的内容放入JSON输出,而不是“完整”关系

class SportsClass(db.Model):
    # ...

class Course(db.Model):
    # ...
    sports_class_id = db.Column(db.Integer, db.ForeignKey(SportsClass.id), nullable=False)
    sports_class = db.relationship(SportsClass, backref='courses')

SportsClass.available_courses = db.relationship(
    Course, primaryjoin=db.and_(
        SportsClass.id == Course.sports_class_id,
        Course.bookable != 'canceled'
    ), viewonly=True
)

(我在猜测您的模型定义,但关键部分是定义并使用最后与
课程
的额外关系。)

您将加入/过滤与加载相关对象混淆了。您当前的查询正在筛选
SportsClass
,以确保至少有一门课程是
可预订的
等待列表的
。但是,这并不影响关系加载的内容,关系与加载查询结果是分开处理的

相反,您可能希望第二个关系只显示未取消的类。然后将该关系的内容放入JSON输出,而不是“完整”关系

class SportsClass(db.Model):
    # ...

class Course(db.Model):
    # ...
    sports_class_id = db.Column(db.Integer, db.ForeignKey(SportsClass.id), nullable=False)
    sports_class = db.relationship(SportsClass, backref='courses')

SportsClass.available_courses = db.relationship(
    Course, primaryjoin=db.and_(
        SportsClass.id == Course.sports_class_id,
        Course.bookable != 'canceled'
    ), viewonly=True
)

(我在猜测您的模型定义,但关键部分是定义并使用最后与
课程
的额外关系。)

您将加入/过滤与加载相关对象混淆了。您当前的查询正在筛选
SportsClass
,以确保至少有一门课程是
可预订的
等待列表的
。但是,这并不影响关系加载的内容,关系与加载查询结果是分开处理的

相反,您可能希望第二个关系只显示未取消的类。然后将该关系的内容放入JSON输出,而不是“完整”关系

class SportsClass(db.Model):
    # ...

class Course(db.Model):
    # ...
    sports_class_id = db.Column(db.Integer, db.ForeignKey(SportsClass.id), nullable=False)
    sports_class = db.relationship(SportsClass, backref='courses')

SportsClass.available_courses = db.relationship(
    Course, primaryjoin=db.and_(
        SportsClass.id == Course.sports_class_id,
        Course.bookable != 'canceled'
    ), viewonly=True
)

(我在猜测您的模型定义,但关键部分是定义并使用最后与
课程
的额外关系。)

您将加入/过滤与加载相关对象混淆了。您当前的查询正在筛选
SportsClass
,以确保至少有一门课程是
可预订的
等待列表的
。但是,这并不影响关系加载的内容,关系与加载查询结果是分开处理的

相反,您可能希望第二个关系只显示未取消的类。然后将该关系的内容放入JSON输出,而不是“完整”关系

class SportsClass(db.Model):
    # ...

class Course(db.Model):
    # ...
    sports_class_id = db.Column(db.Integer, db.ForeignKey(SportsClass.id), nullable=False)
    sports_class = db.relationship(SportsClass, backref='courses')

SportsClass.available_courses = db.relationship(
    Course, primaryjoin=db.and_(
        SportsClass.id == Course.sports_class_id,
        Course.bookable != 'canceled'
    ), viewonly=True
)
(我在猜测您的模型定义,但关键部分是在最后定义并使用与
课程
的额外关系。)