如何限制/抵消sqlalchemy orm relation的结果?

时间:2012-02-05 09:52:37

标签: python orm sqlalchemy

如果我有用户模型和文章模型,用户和文章是一对多的关系。所以我可以访问这样的文章

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

但这会列出用户的所有文章,如果我想将文章限制为10怎么办?在rails中有一个all()方法,它可以有限制/偏移。在sqlalchemy中还有一个all()方法,但是没有参考,如何实现这个目标?

编辑:

似乎user.articles[10:20]有效,但sql在查询中没有使用10/20。所以实际上它会加载所有匹配的数据,并在python中进行过滤?

1 个答案:

答案 0 :(得分:12)

解决方案是使用dynamic关系,如SQLAlchemy文档的collection configuration techniques部分所述。

将关系指定为

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

然后您可以编写user.articles.limit(10),它将生成并执行查询以获取用户的最后十篇文章。或者,如果您愿意,可以使用[x:y]语法自动生成LIMIT子句。

性能应该是合理的,除非您想要为100个左右的用户查询过去十篇文章(在这种情况下,至少会向服务器发送101个查询)。