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}}
答案 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做什么([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