Эффективный Django-запрос для модели с внешним ключом к самой себе

Я создаю простой сайт для публикации в блоге, используя Django. В основном есть две модели: Post и Comment, где модель комментария выглядит следующим образом:

class Comment:
    post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name='comments')
    # A comment can have many replies, and an user can only reply to the "parent" comment (A comment which isn't a reply to any comment)
    reply = models.ForeignKey('self', on_delete=models.CASCADE, null=True, blank=True)
    likes = models.ManyToManyField(User, 'like_comments', blank=True)
    # Some other fields

    def save(self, *args, **kwargs):
        if self.reply is not None:
            self.post = self.reply.post
        super(Comment, self).save(*args, **kwargs)

У меня есть представление на основе класса, которое наследует Django generic DetailView для получения конкретного поста. Проблема в том, что я также хочу получить все комментарии к этому посту, ответы на них и количество лайков эффективным способом . Каков будет наиболее эффективный способ сделать это?

Я придумал следующий способ:

from django.db.models import Prefetch
from django.views.generic.detail import DetailView

# Some views here ...

class PostDetailView(DetailView):
    model = Post
    template_name = 'core/post_detail.html'
    context_object_name = 'post'

    def get_queryset(self, **kwargs):
        return Post.objects.prefetch_related(Prefetch('comments', queryset=Comment.objects.annotate(num_likes=Count('likes'))))

Однако, когда я проверяю запрос с помощью QuerySet.query, необработанный SQL выглядит так же, как если бы я использовал "Post.objects.all()". Я не уверен, что делаю неправильно, или я что-то не так понял. Если я ошибаюсь, как мне это исправить? В противном случае, это уже эффективно?

Вернуться на верх