2017-01-06 4 views
0

У меня есть три таблицы (для приложения, связанного с спортом): раунды, игры и лиги.Querying Flask-SQLAlchemy через два столовых объединения

Я хочу найти самый последний раунд для Лиги. Для этого мне нужно найти самую последнюю игру и найти, в каком раунде она находится.

В моих моделях У раундов есть много Игр и Раундов, есть Лига, но нет прямых отношений между Играми и Лигами.

Вот мои модели упрощено:

class Round(db.Model): 
    """Round Model.""" 

    __tablename__ = 'rounds' 

    id = db.Column(db.Integer, primary_key=True) 
    order = db.Column(db.Integer, nullable=False) 
    league_id = db.Column(db.Integer, db.ForeignKey('leagues.id')) 

    league = db.relationship('League', backref='rounds') 


class Game(db.Model): 
    """Game model.""" 

    __tablename__ = "games" 

    id = db.Column(db.Integer, primary_key=True) 
    utc_time = db.Column(db.DateTime) 
    round_id = db.Column(db.Integer, db.ForeignKey('rounds.id')) 

    round = db.relationship('Round', backref="games") 


class League(db.Model): 
    """League Model.""" 

    __tablename__ = 'leagues' 

    id = db.Column(db.Integer, primary_key=True) 
    name = db.Column(db.String, nullable=False) 

    def __init__(self, name, abbreviation, other_names): 
     self.name = name 

Как я запрашиваю Игры с round.league состоянии?

Я что-то вроде этого думать, но это не работает:

game = Game.query.join(Round).join(League).filter(
     Game.utc_time < datetime.utcnow(), 
     League.id == league.id 
    ).order_by(Game.utc_time.desc()).first() 

ответ

0

После многократного использования документации SQLAlchemy решение было просто для того, чтобы я был более явным при определении моих объединений. Я полагаю, что соединение таблицы не было очевидно для SQLAlchemy по какой-то причине.

Вместо того, чтобы просто join(League) я должен был сказать ему, где присоединиться join(League, Round.league_id == League.id)

Запрос в конечном итоге глядя, как это:

game = Game.query.join(Round).join(
    League, Round.league_id == League.id 
).filter(
    Game.utc_time < datetime.utcnow(), 
    League.id == league.id 
).order_by(Game.utc_time.desc()).first() 
0

Вы пропускаете отношения между League и Round.

class League(db.Model): 
    (...) 
    db.relationship("Round", backref='league') 
    (...) 

Ваш запрос должен работать после того, добавив, что в вашей League модели.

+0

Благодарности @AArias. Раздражающе для всех, у меня есть эти отношения там, только на круглой модели (точно так же, только наоборот). Мои извинения, я случайно удалил эту строку при редактировании вопроса и добавил его обратно. – hammygoonan

+0

Мм. Вы пытались обратить вспять объявления отношений? Попробуйте объявить отношения Лиги-Раунда в модели лиги (как в моем примере кода) и Round-Game в модели Round. Я не могу попробовать это сейчас, потому что я нахожусь на своем телефоне, но, по крайней мере, в примерах sqlalchemy для отношений один-два, отношения объявлены в родительской модели: http://docs.sqlalchemy.org/en/latest/ orm/basic_relationships.html # один-ко-многим, дайте мне знать, если это работает, и я обновлю ответ – AArias

+0

Кроме того, оставьте 'league_id' и' round_id' такими, какие они есть. – AArias

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

  • Нет связанных вопросов^_^