Эффективный 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()". Я не уверен, что делаю неправильно, или я что-то не так понял. Если я ошибаюсь, как мне это исправить? В противном случае, это уже эффективно?