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

Django开发BlogApp多用户独立点赞时间存储问题咨询

解决方案

问题根因

你将like_time字段定义在BlogPost主表中,而每篇文章仅对应一条BlogPost记录,因此每次新用户点赞更新该字段时,必然会覆盖之前存储的时间。要实现每个用户独立存储点赞时间,需要为多对多关联新增自定义中间表,存储用户与文章关联的额外属性。

代码修改

1. 调整models.py定义

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

# 新增多对多关联中间表,存储点赞关联的时间信息
class PostLike(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    post = models.ForeignKey("BlogPost", on_delete=models.CASCADE)
    like_time = models.DateTimeField(auto_now_add=True)

    class Meta:
        # 保证同一个用户对同一篇文章只能产生一条点赞记录
        unique_together = ("user", "post")

class BlogPost(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    # 修正原代码中max_length后的语法错误(-改为=)
    title = models.CharField(max_length=300)
    # 指定多对多关联使用自定义中间表
    likes = models.ManyToManyField(User, related_name="liked_posts", through=PostLike)
    # 正文建议改用TextField存储,不受长度限制
    body = models.TextField()
    # 删除原主表中的like_time字段,该字段已迁移至中间表

2. 调整views.py点赞逻辑

使用自定义中间表后,直接调用add方法无法自动填充中间表的额外字段,改为直接操作中间表创建点赞记录即可:

from django.shortcuts import get_object_or_404
from django.http import JsonResponse
from .models import BlogPost, PostLike

def blog_post_like(request, blogpost_id):
    post = get_object_or_404(BlogPost, pk=blogpost_id)
    # 判断用户是否已点赞该文章
    if not PostLike.objects.filter(user=request.user, post=post).exists():
        PostLike.objects.create(user=request.user, post=post)
        return JsonResponse({"disp": "success"})
    # 可按需补充取消点赞的逻辑

使用示例

查询单篇文章所有点赞用户及对应时间

post = BlogPost.objects.get(id=xxx)
like_records = PostLike.objects.filter(post=post).order_by("-like_time")
for record in like_records:
    print(f"{record.user.username} - liked time - {record.like_time}")

注意事项

修改模型后需要执行迁移命令生效:

python manage.py makemigrations
python manage.py migrate

如果已有历史点赞数据,迁移时按照终端提示处理旧数据即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 05:00:01