SQLAlchemy: muestra solo el último resultado si una combinación devuelve múltiples resultados

Estoy tratando de crear una aplicación Flask que muestre la última puntuación de jugadores individuales. Así que un jugador puede tener múltiples puntajes, pero en la tabla de clasificación solo quiero mostrar su puntaje más reciente.

Mis modelos.py:

class Player(db.Model): __tablename__ = 'player' id = db.Column(db.Integer, primary_key=True) firstname = db.Column(db.String, nullable=False) score = db.relationship('Score', backref='player', lazy='dynamic') def __init__(self, firstname): self.firstname = firstname def __repr__(self): return ''.format(self.id) class Score(db.Model): __tablename__ = 'score' id = db.Column(db.Integer, primary_key=True) timestamp = db.Column(db.DateTime, nullable=False) score = db.Column(db.String, nullable=True) player_id = db.Column(db.Integer, db.ForeignKey('player.id')) def __init__(self, score, player_id): self.timestamp = datetime.now() self.score = score self.player_id = player_id def __repr__(self): return ''.format(self.id) 

En mi app.py tengo lo siguiente:

 @app.route('/', methods=['GET', 'POST']) @login_required def home(): """Render homepage""" players_with_score = db.session.query( Player, Score).join(Score) return render_template('home.html', players_with_score=players_with_score) 

Y en mi plantilla (simplificada) home.html:

  {% for players_with_score in players_with_score %}  {{ players_with_score.Player.firstname }} {{ players_with_score.Score.score }} {{ players_with_score.Score.timestamp }}  {% endfor %}  

Esto da como resultado una tabla adecuada con todas las puntuaciones, pero ahora, si un jugador tiene varias puntuaciones, mostrará ese jugador también varias veces.

¿Qué debo hacer en la consulta para garantizar que solo se muestre la última puntuación por jugador? Intenté agregar .(Score.timestamp == db.session.query(func.max(Score.timestamp))) pero eso hizo que el único resultado fuera la última puntuación, no la última puntuación por jugador.

Puede usar DISTINCT ON ... ORDER BY “idiom” en Postgresql para obtener el mayor número por grupo , donde n es 1, dado que su tabla no es enorme :

 players_with_score = db.session.query(Player, Score).\ join(Score).\ distinct(Player.id).\ order_by(Player.id, Score.timestamp.desc()) 

Dado que Score.timestamp no Score.timestamp , no debe preocuparse por el orden descendente y los valores NULL.