python - Sqlalchemy 覆盖关联表中的字段

标签 python orm sqlalchemy flask-sqlalchemy

我有两个实体,PlayerGame,它们之间的关系是多对多的。 Player 以及PlayerGame 之间的连接(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")

我想使用给定游戏 ID 的 sqlalchemy 编写查询,返回所有相关玩家,但他们的分数将被游戏分数覆盖

到目前为止,我的查询看起来像这样

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

我正在考虑更改 Player.scorePlayerGame.score 标签名称,或者排除 Player.score 但以上都不是真的似乎有效

可以在 python 代码查询之后执行此操作,但理想情况下,我希望它成为查询的一部分

最佳答案

我稍微调整了你的模型,然后在下面使用了一个不返回“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)]

关于python - Sqlalchemy 覆盖关联表中的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58471414/

相关文章:

c++ - 为 ORM C++ 实现 1 到 n 映射

python - 查询 SQL Server 数据库时结果对象不返回行

python - 如何访问连接 SQLAlchemy 中的数据

python - 如何查找文件/字符串中字符串之间的字符串数 - python

python - 在 python 中寻找一些关于组合学的指导

java - 如何根据成员对象的字段值而不是成员对象ID获取实体

django - django事务大小的自适应优化

python - 属性错误 : 'int' object has no attribute '_sa_instance_state'

python - Django:请求页面时异步加载数据?

Python stdout 重定向(特殊)