Django: How to choose a limited number of rows for each foreign key?

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)

Now, how do I get the latest comments, but limit the results to only (say, 3) comments for a single user?

Here's how to do it in pure SQL: How do I select a limited number of rows for each foreign key?

+5
source share
1 answer

I think this would work:

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

However, this does not look like pythons or an effective way to solve the problem. (The performance issue can be resolved with a cache, but still.)

, ? . , -created:

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

LIMIT SQL-, . , , , .

, . , , .

SQL

, , SQL ([1] ), extra() - ([2] - , ).

[1] ?

[2] django.extra( = clauses clobbered .filter(foo__in =... subselects

+3

All Articles