【问题标题】:Flask SQLAlchemy filter records from foreign key relationshipFlask SQLAlchemy 从外键关系中过滤记录
【发布时间】:2026-02-14 06:40:01
【问题描述】:

我有 2 个模型:

class Scenario(db.Model):
    __tablename__ = 'scenarios'
    scenario_id = db.Column(db.Integer, primary_key=True)
    scenario_name = db.Column(db.String(120))
    scenario_text = db.Column(db.Text)
    hints = db.relationship('Hint', backref='scenario', lazy='dynamic')

    def __init__(self, scenario_name, scenario_text):
        self.scenario_name = scenario_name
        self.scenario_text = scenario_text

    def __repr__(self):
        return "<Scenario(scenario_name='%s', scenario_text='%s', hints='%s')>" % self.scenario_name, self.scenario_text, self.hints

class Hint(db.Model):
    __tablename__ = 'hints'
    hint_id = db.Column(db.Integer, primary_key=True)
    scenario_id = db.Column(db.Integer, db.ForeignKey('scenarios.scenario_id'))
    hint = db.Column(db.Text)
    release_time = db.Column(db.Integer)    

    def __init__(self, scenario_id, hint, release_time):
        self.scenario_id = scenario_id
        self.hint = hint
        self.release_time = release_time

    def __repr__(self):
        return "<Hint(scenario_id='%s', hint='%s', release_time='%s')>" % self.scenario_id, self.hint, self.release_time

我希望能够获得所有场景及其相应的提示,但只有 release_time 小于当前时间的提示。

我认为这会起作用:

scenarios = Scenario.query.filter(Scenario.hints.release_time < time.time())

但我收到此错误:

AttributeError: Neither 'InstrumentedAttribute' object nor 'Comparator' object associated with Scenario.hints has an attribute 'release_time'

我刚开始玩 Flask 和 SQLAlchemy。任何建议将不胜感激。

【问题讨论】:

    标签: python sqlalchemy flask


    【解决方案1】:

    Scenario.hints 是一个查询,因此您需要使用连接来执行这种过滤。

    >>> scenarios = Scenario.query.join(Hint).filter(Hint.release_time < time.time())
    >>> scenarios.first()
    >>> <Scenario(scenario_name='hi', scenario_text='world', hints='SELECT hints.hint_id AS hints_hint_id, hints.scenario_id AS hints_scenario_id, hints.hint AS hints_hint, hints.release_time AS hints_release_time FROM hints WHERE :param_1 = hints.scenario_id')>
    

    请参阅query docsORM tutorial 了解更多详情。

    【讨论】:

    • 看到我需要与此匹配的所有记录,因此我使用了 all() 而不是 first()。这没有给我任何数据。
    • 你有任何数据可以匹配这个查询吗? Hint.query.all() 带给你什么?
    • 啊。我错过了将被选中的记录的 release_times 。 :P 这行得通。谢谢