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)