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')