дочернее поле sqlalchemy order_by на обратной ссылке

Ответ больше не нужен, так как я изменил фокус в коде. (см. мой комментарий в ответе) Публикуйте ответы для дальнейшего использования...

Как получить результаты обратной ссылки «один ко многим», упорядоченной по полю в дочернем элементе? Мне нужно все что-то для гида, упорядоченное по индексу. Но в это время они извлекаются случайным образом, даже если они упорядочены на сервере MS SQL.

У меня в TurboGears 2 datamodels.py:

`class Parcel(DeclarativeBase):
    __tablename__ = 'GENERAL'
    __table_args__ =  ({'autoload': True})   

    gid = Column(Integer, primary_key=True)`
    somethings = relationship('Something', backref='Parcel')

 'class Something(DeclarativeBase):
    __tablename__ = 'SKETCH'
    __table_args__ =  ({'autoload': True})

    gid = Column(Integer, ForeignKey('GENERAL.gid'), primary_key=True)
    index = Column(Integer, primary_key=True)

В Turbogears root.py:

query = DBSession.query(Parcel)
query = query.options(joinedload('somethings')
query=session.filter(Parcel.gid==gid)

Возвращает все что-то для gid в неупорядоченном виде.


person stuartz    schedule 18.10.2012    source источник


Ответы (1)


DBSession.query(Something).filter_by(gid=gid).order_by(Something.index).all()

изменить: relationship() принимает аргумент ключевого слова order_by для упорядочения экземпляров при использовании отношения. Если вы хотите указать порядок для обратного направления, вы можете использовать backref() function вместо ключевого слова backref и используйте тот же аргумент ключевого слова order_by, что и для relationship().

person Simon    schedule 18.10.2012
comment
но тогда он больше не используется как обратная ссылка, а становится отдельным запросом и должен быть добавлен в контекстный dict или запрос Parcel. Я ищу способ заказать обратную ссылку, которая уже добавлена ​​в запрос Parcel. Не может быть простого способа сделать это, кроме собственного запроса. - person stuartz; 19.10.2012
comment
Я никогда не мог заказать поле на ребенка. Backref упорядочил дочерний элемент по полю от родителя. И я также не смог заставить backref=backref() работать правильно. В конце концов я сделал отдельные запросы... которые я также сделал для других отношений, которые работали правильно, за исключением случаев, когда слишком много информации приводило к сбою турборедукторов. Отдельные запросы, казалось, выполнялись быстрее и предотвращали сбои. Спасибо за ответ. - person stuartz; 23.10.2012