Аннотирование набора запросов django по количеству связанных объектов кверисета

У меня есть следующие три модели:

class User(AbstractUser):
    username = None
    name = models.CharField(max_length=255)
    email = models.EmailField(unique=True)
    account_type = models.CharField(
        choices=AccountType.choices,
        default=AccountType.GENERAL,
        max_length=8,
    )
    first_name = None
    last_name = None

    USERNAME_FIELD = "email"
    REQUIRED_FIELDS = ["name"]

    objects = UserManager()

    @property
    def total_likes(self):
        queryset = (
            self.works.filter(visibility=Visibility.PUBLIC)
            .select_related()
            .annotate(likes=models.Count("social"))
        )
        return (
            queryset.aggregate(models.Sum("likes")).get("likes__sum")
            or 0
        )

    def __str__(self) -> str:
        return self.name

class WorkImage(models.Model):
    user = models.ForeignKey(
        to=User, on_delete=models.CASCADE, related_name="works"
    )
    title = models.CharField(max_length=255)
    image = models.ImageField(upload_to=work_image_directory_path)
    
    @property
    def likes(self):
        return self.social.count()

    def __str__(self) -> str:
        return f"{self.user.name}'s {self.work_image_type} {self.title}"


class WorkImageSocial(models.Model):
    work = models.ForeignKey(
        to=WorkImage, on_delete=models.CASCADE, related_name="social"
    )
    liked_by = models.ForeignKey(
        to=User, on_delete=models.CASCADE, related_name="liked_works"
    )

    def __str__(self) -> str:
        return f"{self.liked_by.name}=>{self.work.title}"

Я пишу пользовательский фильтр упорядочивания для получения "наиболее понравившихся" пользователей, что я хочу сделать, так это аннотировать пользователей полем под названием "likes", которое будет иметь сумму всех лайков на их рабочих изображениях, как мне этого добиться?

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