2012-02-05 16 views
9

私はユーザーモデルと記事モデルを持っている場合、ユーザーと記事は1対多の関係です。私はこのsqlalchemy ormリレーションの結果を制限/オフセットする方法はありますか?

user = session.query(User).filter(id=1).one() 
print user.articles 

のような記事にアクセスすることができますが、これは私が10に記事を制限したい場合はどのようなユーザーのすべての記事を、一覧表示されますか?レールには、all()メソッドがあり、そこにはリミット/オフセットがあります。 sqlalchemyにはall()メソッドもありますが、これを実現するにはパラメータを取らないでください。

編集:

それは、user.articles[10:20]は有効ですが、SQLクエリでは10月20日を使用していなかったようです。実際には一致したすべてのデータをロードし、Pythonでフィルタリングしますか?

答えて

11

解決策は、SQLAlchemyドキュメントのcollection configuration techniquesセクションに記載されているように、dynamicの関係を使用することです。あなたが生成し、ユーザーによる最後の10件の記事を取得するためにクエリを実行しますuser.articles.limit(10)書くことができます

class User(...): 
    # ... 
    articles = relationship('Articles', order_by='desc(Articles.date)', lazy='dynamic') 

としての関係を指定することにより

。または、LIMIT句が自動的に生成されるようにするには、[x:y]構文を使用できます。

100人ほどのユーザーに対して過去10件の記事を照会したい場合(たとえば、少なくとも101件の照会がサーバーに送信される場合)を除き、パフォーマンスは合理的です。

関連する問題