2014-04-27 52 views
0

以下代碼適用於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降序排序。

同時宣佈的關係,我可以解決這個問題:

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

不過這是後話,我寧願不做。我希望在聲明我的查詢時明確地設置它。

我也可以撥打:

threads[0].messages.reverse() 

..但是這是在神社模板頗爲不便。

爲加入模型設置order_by是否有一個很好的解決方案?

回答

1

您有Thread.messages標記爲lazy='dynamic'。這意味着在查詢線程之後,messages是查詢對象,而不是列表。所以重複threads[0].messages.order_by(Message.created.desc())

+0

你是對的。將排序方法傳遞給模板(我在其中迭代線程對象)並不是最好的方式,但它可以工作。 – kerma

相關問題