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.

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

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)