2013-12-07 3 views
6

У меня есть 2 модели:Колба SQLAlchemy фильтр записей из внешних ключей отношений

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' 

Я только начал играть с колбой и SQLAlchemy. Любой совет будет принят во внимание.

ответ

11

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 docs Смотрите и ORM tutorial для более подробной информации.

+0

Учитывая, что мне нужны все записи, соответствующие этому, я использовал all() вместо first(). Это не дает мне никаких данных. – ahhchuu

+0

Есть ли у вас какие-либо данные, которые удовлетворяют этому запросу? Что дает вам 'Hint.query.all()'? – jonafato

+0

Ах. Я отсутствовал release_times для записей, которые были бы выбраны. : P Это работает. благодаря – ahhchuu

Смежные вопросы