查询父模型时,是否可以筛选关系的内容



我有两个模型来表示电影及其放映时间。我想查询所有电影,但它们的show_times关系应该只包含未来的放映时间。

class PKMovie(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    url = db.Column(db.String(255))
    show_times = db.relationship('ShowTime')
class ShowTime(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    date = db.Column(db.Date)
    pk_movie_id = db.Column(db.Integer, db.ForeignKey('pk_movie.id'))

查询父级时是否可能影响关系的内容?

默认情况下,关系是一个简单的等式表达式:Parent.id == ForeignKey.id。您不能在查询时更改关系的内容*,但可以创建另一个只选择所需项目的关系。

class PKMovie(db.Model):
    # ...
    future_show_times = db.relationship(
        lambda: ShowTime,
        primaryjoin=lambda: db.and_(
            PKMovie.id == ShowTime.pk_movie_id,
            ShowTime.date >= db.func.current_timestamp()
        ),
        viewonly=True
    )

访问实例的future_show_times将只返回将来的显示时间。您可以在查询期间急切地加载此关系,这样在访问时就不会产生额外的数据库查询。

PKMovie.query.options(db.joinedload(PKMovie.future_show_times)).all()

有关关系,请参阅文档。


*从技术上讲,可以在查询时更改关系,如这个答案所示。然而,我认为明确定义这些其他关系要清楚得多。

最新更新