2014-04-27 1 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 객체가 Message.created에 의해 정렬되지 않습니다. 관계를 선언하면서

나는이 문제를 해결할 수 있습니다 :

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

그러나이 차라리하지 않을 것입니다 무언가이다. 내 쿼리를 선언하는 동안 이것을 명시 적으로 설정해야합니다.

또한 호출 할 수

threads[0].messages.reverse() 

을이 신사 템플릿에서 매우 불편 ..하지만.

조인 된 모델에 대해 order_by를 설정하는 좋은 해결책이 있습니까?

답변

1

Thread.messageslazy='dynamic'으로 표시되어 있습니다. 즉, 스레드를 쿼리 한 후 messages은 아직 쿼리 개체가 아니라 목록입니다. 그러므로 threads[0].messages.order_by(Message.created.desc())을 반복합니다.

+0

정확합니다. 순서 지정 메소드를 템플릿 (여기서는 스레드 객체를 반복)에 전달하는 것이 가장 좋은 방법은 아니지만 작동합니다. – kerma