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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 06:41:21