在django中预取有限数量的相关对象

时间:2013-04-08 08:48:43

标签: python database django orm

我想显示帖子列表,每个帖子有5个最新评论。如何使用最少数量的数据库查询来实现这一目标?

Post.objects.filter(...).prefetch_related('comment_set')

检索所有评论,而我只需要其中几条。

1 个答案:

答案 0 :(得分:1)

我会选择两个问题。首先得到帖子:

posts = list(Post.objects.filter(...))

现在使用UNION运行原始SQL查询(注意:为简单起见省略了排序):

sql = "SELECT * FROM comments WHERE post_id=%s LIMIT 5"
query = []
for post in posts:
    query.append( sql % post.id )
query = " UNION ".join(query)

并运行它:

comments = Comments.objects.raw(query)

之后,您可以循环注释并在Python端对它们进行分组。

我没试过,但看起来还不错。

您的问题还有其他可能的解决方案(可能只需要查询一个查询),请看一下:

http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/