Django distinct и group_by запросы с использованием ORM и MySQL

Я хочу получить QuerySet, содержащий все последние комментарии для каждого поста, используя Django ORM. Комментарии могут быть упорядочены по полю when.

Предположим следующий пример:

class Post(models.Model):
    name = models.TextField()


class Comment(models.Model):
    title = models.TextField()
    when = models.DateTimeField(auto_now_add=True)
    post = models.ForeignKey(Post, on_delete=models.CASCADE)

Этого можно добиться в сыром SQL, поэтому я предполагаю, что у Django тоже может быть свой способ. Я бы хотел избежать использования необработанных запросов (что не рекомендуется в документации Django).

Я не могу использовать distinct() с именами полей, так как я использую MySQL. Любые указания будут приняты с благодарностью.

Мы можем работать с FilteredRelation [Django-doc] здесь:

from django.db.models import FilteredRelation, OuterRef, Q

Post.objects.annotate(
    latest_comment=FilteredRelation(
        'comment_set',
        condition=Q(
            comment=Subquery(
                Comment.objects.filter(post=OuterRef('pk'))
                .order_by('-when')
                .values('pk')[:1]
            ),
        ),
    ),
).select_related('latest_comment')
Вернуться на верх