Аннотирование набора запросов 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", которое будет иметь сумму всех лайков на их рабочих изображениях, как мне этого добиться?