在相关模型上过滤模型仍会显示“已过滤”的相关对象

时间:2014-11-14 09:36:47

标签: python sqlalchemy

SportsClass有很多Courses。我希望能够只获得可用的课程。

我尝试了以下内容:

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并简化):

[
"description": "description",
    "courses": [
      {
        "name": "Name",
        "bookable": "waitingList",
      },
      {
        "name": "Keine Angaben",
        "bookable": "canceled",
      }
    ],
  }
]

为什么取消的课程也在结果集中?我怎样才能获得每堂课的可用课程?

1 个答案:

答案 0 :(得分:3)

您在加载/过滤加载相关对象时感到困惑。您当前的查询正在过滤SportsClass,以确保至少有一个的课程为'bookable''waitingList'。但是,这不会影响由关系加载的内容,而是与加载查询结果分开处理。

相反,您可能希望第二个关系仅显示未取消的类。然后将该关系的内容放在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
)

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