Django保存博文点赞时间报错:datetime对象无save属性
问题修复方案
报错原因
- 你错误调用了
like_time字段值的save()方法:like_time是DateTime类型字段,读取时返回的是datetime.datetime实例,该类本身没有save方法,只有Django模型实例(也就是你代码里的blogpost对象)才内置save()方法用于持久化修改到数据库。 - 你给
like_time字段设置了auto_now=True参数,该参数的作用是每次模型实例调用save方法时,自动将该字段更新为当前时间,不需要你手动赋值或调用保存方法。
额外提示:你原有代码中
like字段的related_name='like '后面多了一个空格,建议删除空格,或者修改为语义更清晰的名称比如related_name='liked_posts',避免后续反向查询时报错。
快速修复方案
直接修改视图函数中报错的代码行即可:
def like_post(request,blogpost_id): blogpost = get_object_or_404(BlogPost, pk=blogpost_id) if request.GET.get('submit') == 'like_post': blogpost.like.add(request.user) # 调用模型实例的save方法,auto_now会自动更新like_time为当前时间 blogpost.save() return redirect('home') else: return redirect('home')
注意:视图函数中所有分支都需要返回响应对象,你原有代码点赞分支没有加
return redirect,会触发后续报错。
进阶优化(适配多用户点赞时间存储)
你当前的模型设计里like_time是BlogPost的字段,只能存储博文最后一次被点赞的时间,无法保存每个用户各自的点赞时间。如果需要记录每个用户的点赞时间,需要用中间表改造多对多关系:
- 新增点赞中间模型,单独存储点赞关联和时间
class LikeRecord(models.Model): user = models.ForeignKey(User, on_delete=models.CASCADE) blogpost = models.ForeignKey(BlogPost, on_delete=models.CASCADE) # 新增时自动写入时间,不需要修改 like_time = models.DateTimeField(auto_now_add=True)
- 修改
BlogPost的多对多字段指定中间表
class BlogPost(models.Model): user = models.ForeignKey(User, on_delete=models.CASCADE) title = models.CharField(max_length=30) date_post_added = models.DateTimeField(auto_now_add=True) # 通过through参数指定自定义中间表 like = models.ManyToManyField(User,related_name='liked_posts',blank=True, through='LikeRecord')
- 点赞逻辑调整为创建中间表记录
def like_post(request,blogpost_id): blogpost = get_object_or_404(BlogPost, pk=blogpost_id) if request.GET.get('submit') == 'like_post': # 自动避免重复点赞 LikeRecord.objects.get_or_create(user=request.user, blogpost=blogpost) return redirect('home') else: return redirect('home')
内容的提问来源于stack exchange,提问作者user16559633
相关产品推荐
相关产品推荐

