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]