Django中实现点赞计数器时出现错误,请求技术解决方案
实现Django点赞计数器的正确统计方法
问题背景
需要为Django博客项目实现点赞统计功能,现有模型代码如下,但likes_count方法实现报错:
原模型代码
from django.db import models from django.contrib.auth.models import User from django.urls import reverse class post(models.Model): user = models.ForeignKey(User,on_delete=models.CASCADE, related_name='posts') title = models.CharField(max_length=150) body = models.TextField() slug = models.SlugField() create = models.DateTimeField(auto_now_add=True) update = models.DateTimeField(auto_now=True) def __str__(self): return f'{self.title} - {self.update}' def get_absolute_url(self): return reverse('home:post_detail',args=(self.pk ,self.slug)) def likes_count(self): ....... # 问题所在 class Vote(models.Model): user = models.ForeignKey(User, on_delete=models.CASCADE,name='uvote') post = models.ForeignKey(post,on_delete=models.CASCADE , name='pvote') def __str__(self) -> str: return f'{self.uvote} ---- {self.pvote.slug}'
尝试了以下代码但报错:
def likes_count(self): return self.pvote.count()
解决方案
错误原因
pvote是Vote模型中指向post的外键字段名,Post模型无法直接通过这个名称访问关联的Vote记录。Django中,外键的反向关联默认名称为[模型名]_set(全小写),所以Post模型需要通过这个反向关联来统计点赞数。
方法1:使用默认反向关联
直接修改Post模型的likes_count方法:
def likes_count(self): return self.vote_set.count()
方法2:自定义反向关联名称(更推荐)
为了代码可读性更强,给Vote模型的post外键添加related_name参数,修改Vote模型:
class Vote(models.Model): user = models.ForeignKey(User, on_delete=models.CASCADE,name='uvote') # 添加related_name='votes' post = models.ForeignKey(post,on_delete=models.CASCADE , name='pvote', related_name='votes') def __str__(self) -> str: return f'{self.uvote} ---- {self.pvote.slug}'
然后Post模型的likes_count方法可以写成:
def likes_count(self): return self.votes.count()
额外建议
遵循Django模型命名规范,将模型名post改为Post(首字母大写),避免后续出现命名相关的问题。
内容的提问来源于stack exchange,提问作者Mehran Ebadi
相关产品推荐
相关产品推荐

