Picture

Oi, eu sou Capi Etheriel.

Web Developer, Web Designer, Web Scraper. Consultor em tecnologias Livres para Web. Contribuidor Drupal, Scrapy, Javascript.

SQLAlchemy: Configurando multiplas relações com a mesma tabela

Um dos meus alunos na [Thinkful][thinkful-service] precisou configurar duas relações de uma modelo Game com o modeloUser. Pra isso é preciso declarar qual campo de foreign key está sendo usado. O modelo do Game ficou assim:

class Game(Base):
    id = Column(Integer, primary_key=True)

    player1_id = Column(Integer, ForeignKey('users.id'))
    player1 = relationship('User', uselist=False, foreign_keys=['player1_id'])

    player2 = Column(Integer, ForeignKey('users.id'))
    player2 = relationship('User', uselist=False, foreign_keys=['player2_id'])

Simples. Mas para o backref no modelo User, eu queria apenas uma chave listando todos os Game em que o User aparece como player1 ou player2. Para isso eu precisei definir manualmente o primary join:

class User(Base):
    id = Column(Integer, primary_key=True)
    games = relationship(
        'Game', viewonly=True,
        primary_join='or_(User.id == Game.player1, User.id == Game.player2)')

Assim eu posso carregar um usuário e listar todos os seus jogos usando user.games:

user = User.query.get(1)
games = [game for game in user.games]