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

标签 python sqlalchemy flask-sqlalchemy

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

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 将仅返回 future 的放映时间。您可以在查询期间预先加载此关系,这样在访问时就不会产生额外的数据库查询。

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

请参阅documentation for relationships .


* 从技术上讲,您可以在查询时更改关系,如 this answer 所示。不过,我认为明确定义这些其他关系会更清晰。

关于python - 查询父模型时可以过滤关系的内容吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26787222/

相关文章:

python - 如何找到特定单元格位置的单元格数据值列表?

python - 在 Python 中读取 CSV 文件并将数据传递给 Jinja 模板

python - 在 Flask 中使用 SQLAlchemy 创建数据库

python - 如何在 numpy 中将二维数组中的行切片归零?

python - 是否有更简单的方法来完成以下练习?我根据三个条件向字符串添加元素

python - Flask-SQLAlchemy:更新一对多关系

postgresql - sqlalchemy/postgresql : database column computed default value

python - SQLAlchemy 递归错误 : maximum recursion depth exceeded while calling a Python object

mysql - Python-Sqlalchemy 二进制列类型 HEX() 和 UNHEX()

sqlalchemy - 使用 SQLAlchemy 的 Pylons 应用程序中的原始 SQL?