SQLAlchemy: Как упорядочить результаты запроса (order_by) в поле отношения? - PullRequest
22 голосов
/ 25 марта 2012

Модели

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))

Поиск

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

Это не работает .... Я искал везде и читал документацию.Но я просто не вижу, как я могу отсортировать мой (базовый) запрос по имени их отношения «владелец».

Это всегда приводит к:

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

Это должно быть легко ..но я этого не вижуТакже смотрел в Comparators, что казалось логичным, но я не вижу, где генерируется часть запроса для ORDER BY или что я должен возвращать, так как все генерируется динамически.И создание компаратора для каждого из моих отношений с игроком, чтобы сделать простую вещь, кажется слишком сложным.

1 Ответ

34 голосов
/ 25 марта 2012

SQLAlchemy хочет, чтобы вы мыслили в терминах SQL.Если вы делаете запрос для «Base», это:

SELECT * FROM base

просто.Так как в SQL вы бы выбрали строки из «base» и упорядочили по столбцу «name» в совершенно другой таблице, то есть «player»?Вы используете соединение:

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

В SQLAlchemy используется идентичный мыслительный процесс - вы присоединяетесь ():

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