首页 文章

在查询父模型时,是否可以过滤关系的内容?

提问于
浏览
2

我有两个模特代表电影和他们的表演时间 . 我想查询所有电影,但他们的 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'))

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

1 回答

  • 3

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

    documentation for relationships .


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

相关问题