如何限制/偏移SQLAlchemy ORM关联的结果?

16 投票
1 回答
15883 浏览
提问于 2025-04-17 12:21

假设我有一个用户模型和一个文章模型,用户和文章之间是一对多的关系。所以我可以像这样访问文章:

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 个回答

26

解决办法是使用一种叫做 dynamic 的关系,这在SQLAlchemy的文档中有提到,具体在集合配置技巧的部分。

通过将关系指定为

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

你就可以写 user.articles.limit(10),这样会生成并执行一个查询,来获取这个用户最近的十篇文章。或者,如果你喜欢的话,也可以使用 [x:y] 这种写法,它会自动生成一个 LIMIT 条件。

性能应该是可以接受的,除非你想要查询大约100个用户的最近十篇文章(在这种情况下,至少会向服务器发送101个查询)。

撰写回答