如何在查询执行时对关系对象进行排序

时间:2014-04-27 12:47:09

标签: python orm sqlalchemy flask-sqlalchemy

以下代码适用于Flask-SQLAlchemy,但在SQLAlchemy中非常相似。

我有两个简单的类:

class Thread(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    subject = db.Column(db.String)
    messages = db.relationship('Message', backref='thread', lazy='dynamic')

class Message(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    created = db.Column(db.DateTime, default=datetime.utcnow())
    text = db.Column(db.String, nullable=False)

我想查询所有线程并按最后创建的消息排序。这很简单:

threads = Thread.query.join(Message).order_by(Message.created.desc()).all()

线程现在是我可以迭代的正确排序列表。但是,如果我迭代 threads[0].messages然后消息对象不按Message.created descending排序。

我可以在声明关系时解决这个问题:

messages = relationship('Message', backref='thread', lazy='dynamic',
                                   order_by='Message.created.desc()')

然而,这是我不想做的事情。我想在声明我的查询时明确设置它。

我也可以打电话:

threads[0].messages.reverse()

..但这在Jinja模板中非常不方便。

为连接模型设置order_by有一个很好的解决方案吗?

1 个答案:

答案 0 :(得分:1)

Thread.messages标记为lazy='dynamic'。这意味着在查询线程后,messages是查询对象,而不是列表。所以迭代threads[0].messages.order_by(Message.created.desc())