【问题标题】:sqlalchemy child field order_by on backrefbackref上的sqlalchemy子字段order_by
【发布时间】:2012-10-09 05:42:11
【问题描述】:

由于我改变了代码的重点,因此不再需要答案。 (请参阅我在答案中的评论)发布答案以供将来参考...

如何从子字段排序的一对多反向引用中检索结果?我需要按索引排序的 gid 的所有东西。但是此时即使在ms sql server中排序,也会随机检索。

我在 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 无序的所有内容。

【问题讨论】:

    标签: sqlalchemy sql-order-by relationship turbogears2


    【解决方案1】:

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

    编辑: relationship() accepts a keyword argument order_by 在您使用关系时对实例进行排序。如果要指定反向排序,可以使用backref() function 代替 backref 关键字,并使用与relationship() 相同的order_by 关键字参数。

    【讨论】:

    • 但随后它不再用作反向引用,而是成为单独的查询,需要添加到上下文字典或包裹查询中。我正在寻找一种方法来订购已经添加到 Parcel 查询中的 backref。除了自己的查询之外,可能没有简单的方法可以做到这一点。
    • 我永远无法按孩子的字段排序。 backref 通过父项的字段对子项进行排序。而且我也无法让 backref=backref() 正常工作。我最终做了单独的查询......我也在其他正常工作的关系上做了这些,除非太多信息导致涡轮齿轮箱崩溃。单个查询似乎运行得更快并防止了崩溃。感谢您的回复。
    猜你喜欢
    • 2013-02-09
    • 2017-11-16
    • 2020-11-04
    • 1970-01-01
    • 1970-01-01
    • 2018-12-22
    • 2017-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多