GenericForeignKey. Оптимизированный запрос для получения всех лайков определённой статьи пользователя

В процессе написания пользовательского профиля решил добавить при наведении на запись показ лайков (как в инстаграмме). Но за фильтрацию и получение лайков для определённой записи у меня отвечает простенький менеджер. Главная его проблема - он получает queryset лениво, даже если я указал модель лайков в prefetch_related в итоге количество запросов становится огромное. Я пока не очень разбираюсь во всех нюансах джанговской ORM, поэтому прошу подсказать как мне это оптимизировать.

Вот части моего кода:

Модель лайков и дизлайков:

class LikesDislikes(models.Model):
    LIKE = 1
    DISLIKE = 0

    VOTES = (
        (LIKE, 'Liked'),
        (DISLIKE, 'Not liked')
    )

    vote = models.SmallIntegerField(verbose_name="Vote", choices=VOTES)
    user = models.ForeignKey(User, verbose_name="User", null=True, on_delete=models.SET_NULL)

    content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey('content_type', 'object_id')

    objects = LikesDislikesManager()

    class Meta:
        verbose_name = 'Likes and dislikes'
        verbose_name_plural = verbose_name

Менеджер для лайков и дизлайков:

class LikesDislikesManager(models.Manager):

    def likes(self):
        return self.get_queryset().filter(vote=1)

    def dislikes(self):
        return self.get_queryset().filter(vote=0)

А вот часть views.py, которая рендерит страничку:

class UserProfile(views.View):

    def get(self, request, username, *args, **kwargs):
        user_profile = get_object_or_404(User, username=username)
        user_comics = Comics.objects.prefetch_related('unique_views', 'like_dislikes').filter(author=user_profile)
        comics_quantity = user_comics.count()

        context = {
            'user_profile': user_profile,
            'user_comics': user_comics,
            'comics_col': comics_quantity,
        }
        return render(request, 'profile.html', context=context)
Вернуться на верх