查询父模型时可以过滤关系的内容吗?

发布于 2021-01-29 16:38:52

我有两个模特代表电影及其放映时间。我想查询所有电影,但它们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'))

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

关注者
0
被浏览
42
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    关系默认情况下是一个简单的相等表达式: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()
    

    有关关系,请参见文档


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



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看