Django:如何为每个外键选择有限数量的行?

时间:2011-07-15 10:19:17

标签: django

class Comment (models.Model):
        user = models.ForeignKey(User, related_name="comments")
        title = models.TextField(max_length=256)
        comment = models.TextField(max_length=1286)
        created = models.DateTimeField(db_index=True)

现在我如何获得最新评论,但将结果限制为每个同一用户只有(例如3条)评论?

以下是它在纯SQL中的完成方式:{​​{3}}

1 个答案:

答案 0 :(得分:3)

我想,这会奏效:

Comment.objects.filter(*[
    ~Q(id__in=user.comments.order_by('-created')[3:].values_list('id', flat=True))
    for user in User.objects.all()
])

但是,它似乎既不是pythonic也不是解决问题的有效方法。 (效率问题可以通过使用缓存来解决,但仍然。)

无论如何,你想要达到什么目的?您可以只获取所有用户的评论并仅使用最新的三条评论。假设您的评论是按-created字段排序的:

{% for user in users %}
    {% for comment in user.comments.all|slice:"3" %}{{ comment }}{% endfor %}
{% endfor %}

切片将在SQL查询中转换为LIMIT子句,因此您无论如何都不会获得所有注释。当然,为了获得所有注释,会执行更多的查询,因此使用模板缓存可以提供帮助。

同样,这可能对你的情况没有意义。如果没有,那么如果你澄清要求会更好。

原始SQL

如果你知道如何用原始SQL做什么([1]可能有帮助),那么你需要找到一种方法将它放入extra()某种方式([2]是一个复杂的例子额外的查询,可能会给你一个想法)。

[1] How to select a limited amount of rows for each foreign key?

[2] django's .extra(where= clauses are clobbered by table-renaming .filter(foo__in=... subselects