Обратитесь к другой модели и подсчитайте ее 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

Пройдитесь по всем вашим системам лайков, желтой, синей, красной, и сложите количество пользователей каждой системы лайков вместе.

Это очень редкое явление. Я думаю, что вы можете использовать "Самый простой способ".

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