Поле перезаписи Sqlalchemy из таблицы ассоциаций - PullRequest
3 голосов
/ 20 октября 2019

У меня есть две сущности, Player и Game, и отношения между ними много-много. И Player, и соединение между Player и Game (PlayerGame) имеют оценку

class Player(db.Model):
 id = db.Column(db.Integer, primary_key=True, autoincrement=True)
 score = db.Column(db.Float)
 name = db.Column(db.String(45), nullable=False)

class Game(db.Model):
  id = db.Column(db.Integer, primary_key=True, autoincrement=True)
  name = db.Column(db.String(45))

class PlayerGame(db.Model):
  player_id = db.Column(db.Integer, db.ForeignKey('players.id'), primary_key=True)
  game_id = db.Column(db.Integer, db.ForeignKey('games.id'), primary_key=True)
  score = db.Column(db.Float)

  player = db.relationship("Player", backref="games")
  game = db.relationship("Game", backref="players")

Я хочу написать запрос с использованием sqlalchemy, который с заданным идентификатором игры возвращает всех связанных игроков, но их оценка будет перезаписана счетом игры

Пока мой запрос выглядит так

Player.query.join(PlayerGame, and_(
    PlayerGame.player_id == Player.id,
    PlayerGame.game_id == game_id))\
.options(contains_eager(Player.games))

Я думал об изменении Player.score и PlayerGame.score названий меток, илиисключая Player.score, но ничего из вышеперечисленного действительно не работает

Это возможно сделать после запроса в коде Python, но в идеале я хочу, чтобы он был частью запроса

1 Ответ

0 голосов
/ 24 октября 2019

Я немного скорректировал вашу модель, а затем ниже использовал запрос, который не доставляет обратно объект "Player", потому что результатом является атрибут от игрока и атрибут от PlayerGame:

class Player(db.Model):
  id = db.Column(db.Integer, primary_key=True, autoincrement=True)
  score = db.Column(db.Float)
  name = db.Column(db.String(45), nullable=False)
  playergames = db.relationship('PlayerGame', backref='player', lazy=True, 
     cascade="delete")

class Game(db.Model):
  id = db.Column(db.Integer, primary_key=True, autoincrement=True)
  name = db.Column(db.String(45))
  playergames = db.relationship('PlayerGame', backref='game', lazy=True, 
  cascade="delete")

class PlayerGame(db.Model):
  player_id = db.Column(db.Integer, db.ForeignKey('player.id'), primary_key=True)
  game_id = db.Column(db.Integer, db.ForeignKey('game.id'), primary_key=True)
  score = db.Column(db.Float)

p = Player(name = "Hoffmann", score = 7.5)
p1 = Player(name = "Fink", score = 4.5)
db.session.add(p)
db.session.add(p1)

g = Game(name = "VfB")
g1 = Game(name = "HSV")

db.session.add(g)
db.session.add(g1)

pg = PlayerGame(player = p, game = g, score = 1.5)
pg1 = PlayerGame(player = p1, game = g, score = 3.5)
db.session.add(pg)
db.session.add(pg1)
db.session.commit()    

playergamescores = db.session.query(Player.name, 
    PlayerGame.score).join(Player).filter(PlayerGame.game_id == g.id).all()   
print(playergamescores)

В таком случае вывод будет [('Hoffmann', 1.5), ('Fink', 3.5)]

...