Обратитесь к другой модели и подсчитайте ее ManytomanyField
У меня есть две модели:
class Post(models.Model):
content = models.TextField(blank=False)
author = models.ForeignKey("User", on_delete=models.CASCADE, related_name="author")
timestamp = models.DateTimeField(auto_now_add=True)
def serialize(self):
likes_count = self.liked_by.all().count()
return {
"id": self.id,
"content": self.content,
"author": self.author.username,
"author_id": self.author.id,
"timestamp": self.timestamp.strftime("%b %d %Y, %I:%M %p"),
"likes": likes_count
}
и
class Liking_System(models.Model):
users_who_like = models.ManyToManyField("User", related_name="users_liked")
post = models.ForeignKey("Post", on_delete=models.CASCADE, related_name="liked_by")
def __str__(self):
return f"Post {self.post.id} is liked by {', '.join([user.username for user in self.users_who_like.all()])}"
Я хочу,
чтобы в моей модели Post, она была связана с Liking_System и подсчитывала, скольким пользователям понравился пост, и возвращала это значение. Как я могу это сделать? Как мне изменить "likes_count = self.liked_by.all().count()". Например, мой пост #1 нравится двум пользователям A и B, но возвращается только 1?Самый простой способ:
Полностью удалите Liking_System
-модель. Не имеет смысла иметь несколько Liking_System
, по крайней мере, с точки зрения предоставленного вами фрагмента кода.
class Post(models.Model):
content = models.TextField(blank=False)
author = models.ForeignKey("User", on_delete=models.CASCADE, related_name="posts")
timestamp = models.DateTimeField(auto_now_add=True)
likers = models.ManyToManyField("User", related_name="liked_posts", blank=True) # Add this line
def serialize(self):
likes_count = self.likers.count() # Modify this line
return {
"id": self.id,
"content": self.content,
"author": self.author.username,
"author_id": self.author.id,
"timestamp": self.timestamp.strftime("%b %d %Y, %I:%M %p"),
"likes": likes_count
}
Точный ответ на ваш вопрос
Если вам действительно нужны отдельные системы лайков, то это выглядит несколько иначе. Представим, что у вас есть синяя и желтая системы лайков. В зависимости от цвета кнопки "нравится" используются разные системы лайков. А в модели Post
вы хотите отображать/подсчитывать количество общих лайков всех систем лайков. Приведенный вами фрагмент кода likes_count = self.liked_by.all().count()
подсчитывает только количество различных систем лайков, связанных с вашим постом.
# explanatory noob version
likes_count = 0
for i in self.liked_by.all():
likers_count += i.users_who_like.count()
# pro / djangonic version
likes_count = self.liked_by.aggregate(likes=Count('users_who_like'))['likes'] or 0
Пройдитесь по всем вашим системам лайков, желтой, синей, красной, и сложите количество пользователей каждой системы лайков вместе.
Это очень редкое явление. Я думаю, что вы можете использовать "Самый простой способ".