SQLAlchemy: ¿Cómo ordenar los resultados de la consulta (order_by) en el campo de una relación?

Modelos

from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, ForeignKey from sqlalchemy import Integer from sqlalchemy import Unicode from sqlalchemy import TIMESTAMP from sqlalchemy.orm import relationship BaseModel = declarative_base() class Base(BaseModel): __tablename__ = 'base' id = Column(Integer, primary_key=True) location = Column(Unicode(12), ForeignKey("locationterrain.location"), unique=True,) name = Column(Unicode(45)) ownerid = Column(Integer,ForeignKey("player.id")) occupierid = Column(Integer, ForeignKey("player.id")) submitid = Column(Integer,ForeignKey("player.id")) updateid = Column(Integer,ForeignKey("player.id")) owner = relationship("Player", primaryjoin='Base.ownerid==Player.id', join_depth=3, lazy='joined') occupier= relationship("Player", primaryjoin='Base.occupierid==Player.id', join_depth=3, lazy='joined') submitter = relationship("Player", primaryjoin='Base.submitid== Player.id', join_depth=3, lazy='joined') updater= relationship("Player", primaryjoin='Base.updateid== Player.id', join_depth=3, lazy='joined') class Player(BaseModel): __tablename__ = 'player' id = Column(Integer, ForeignKey("guildmember.playerid"), primary_key=True) name = Column(Unicode(45)) 

buscando

 bases = dbsession.query(Base) bases = bases.order_by(Base.owner.name) 

Esto no funciona … He buscado por todas partes y leí la documentación. Pero simplemente no veo cómo puedo ordenar mi consulta (Base) en el nombre de su relación de “propietario”.

Siempre resulta en:

  AttributeError: Neither 'InstrumentedAttribute' object nor 'Comparator' object has an attribute 'name' 

Esto debe ser fácil … pero no lo veo. También examiné los comparadores, que parecían lógicos, pero no veo dónde se genera la parte de consulta para el ORDEN POR o lo que debería devolver, ya que todo se genera de forma dinámica. Y hacer un comparador para cada una de mis relaciones de “jugador” para hacer una cosa simple parece demasiado complicado.

SQLAlchemy quiere que pienses en términos de SQL. Si haces una consulta para “Base”, eso es:

 SELECT * FROM base 

fácil. Entonces, ¿cómo, en SQL, seleccionaría las filas de “base” y ordenaría por la columna “nombre” en una tabla totalmente diferente, es decir, “jugador”? Usas una unión:

 SELECT base.* FROM base JOIN player ON base.ownerid=player.id ORDER BY player.name 

SQLAlchemy te hace usar el proceso de pensamiento idéntico: te unes a ():

 session.query(Base).join(Base.owner).order_by(Player.name)