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

Django中为Post模型添加用户独立的点赞布尔字段是否可行?

这种实现方式不可行

你想通过在Post模型中添加布尔字段来实现用户独立的点赞状态,完全不可行。原因很简单:Post模型的字段是属于帖子本身的全局属性,一旦修改这个布尔字段的值,所有用户查询该帖子时都会拿到同一个结果,根本做不到“用户1设为true,其他用户看到仍为false”的效果。

正确的实现方案

要实现用户独立的点赞状态,本质是要记录用户和帖子之间的关联关系,推荐两种常用方式:

1. 使用多对多字段(ManyToManyField)

直接在Post模型中添加一个关联User的多对多字段,用来记录所有给该帖子点赞的用户:

from django.db import models
from django.contrib.auth.models import User

class Post(models.Model):
    title = models.CharField(max_length=200)
    content = models.TextField()
    # 关联点赞的用户,blank=True允许帖子没有点赞
    liked_users = models.ManyToManyField(User, related_name='liked_posts', blank=True)
    
    # 封装判断方法,方便调用
    def is_liked_by(self, user):
        # 检查当前用户是否在点赞列表中
        return self.liked_users.filter(id=user.id).exists()

使用时,在视图或模板中只需调用post.is_liked_by(request.user)就能判断当前用户是否点赞了该帖子。

2. 单独创建点赞模型(适合需要额外信息的场景)

如果需要记录点赞的时间、点赞的额外状态等信息,可以单独创建一个Like模型,通过外键关联User和Post:

class Like(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    post = models.ForeignKey(Post, on_delete=models.CASCADE)
    created_at = models.DateTimeField(auto_now_add=True)  # 记录点赞时间
    
    class Meta:
        # 确保一个用户只能给同一个帖子点赞一次
        unique_together = ('user', 'post')

判断用户是否点赞时,只需查询是否存在对应的记录:

is_liked = Like.objects.filter(user=request.user, post=post).exists()

内容的提问来源于stack exchange,提问作者zequuee1

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 23:42:11