以下代码适用于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有一个很好的解决方案吗?
答案 0 :(得分:1)
您Thread.messages
标记为lazy='dynamic'
。这意味着在查询线程后,messages
是查询对象,而不是列表。所以迭代threads[0].messages.order_by(Message.created.desc())
。