You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django模型关联问题:Post关联Liking_System后点赞数统计异常如何修正?

解决Django帖子点赞数统计问题

当前问题原因

你当前的self.liked_by.all().count()统计的是关联的Liking_System实例数量,而非点赞用户的数量。因为帖子#1只对应1个Liking_System实例(里面包含用户A和B),所以返回1而非预期的2。

修改代码方案

直接获取关联的Liking_System实例,统计其中的点赞用户数即可:

def serialize(self):
    # 先检查是否存在点赞记录,避免无点赞时抛出异常
    if self.liked_by.exists():
        likes_count = self.liked_by.first().users_who_like.count()
    else:
        likes_count = 0
    
    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
    }

模型设计优化建议

你的模型设计绕了弯路,点赞本质是帖子与用户的多对多关系,更符合Django规范的做法是直接在Post中定义多对多字段,用Liking_System作为中间模型:

  1. 修改Post模型:
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)
    # 直接定义多对多关系,关联User并指定中间模型
    liked_by = models.ManyToManyField("User", through="Liking_System", related_name="liked_posts")
    
    def serialize(self):
        # 此时直接统计关联的用户数量即可
        likes_count = self.liked_by.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
        }
  1. 简化Liking_System模型(仅保留关联字段,可按需添加额外字段如点赞时间):
class Liking_System(models.Model):
    user = models.ForeignKey("User", on_delete=models.CASCADE)
    post = models.ForeignKey("Post", on_delete=models.CASCADE)

    def __str__(self):
        return f"Post {self.post.id} is liked by {self.user.username}"

这种设计更符合Django的多对多关系逻辑,后续扩展(如查询用户点赞的帖子、帖子的点赞用户列表)也会更便捷。

内容的提问来源于stack exchange,提问作者Khoa Nguyễn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 08:32:42