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作为中间模型:
- 修改
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 }
- 简化
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
相关产品推荐
相关产品推荐

