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
相关产品推荐
相关产品推荐

