【发布时间】:2019-02-20 11:56:48
【问题描述】:
我想通过单击按钮保存对任何帖子的评论,但收到错误消息: /user_add_comment 处的值错误 禁止 save() 以防止由于未保存的相关对象 'profile_user' 而导致数据丢失。
型号:
class UserProfileInfo(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
bio = models.TextField(max_length=100, blank=True, default="Bio")
profile_pic = models.ImageField(upload_to='profile_users', blank=True)
def __str__(self):
return self.user.username
class CommentPostModel(models.Model):
profile_user = models.OneToOneField(UserProfileInfo, on_delete=models.CASCADE)
post = models.ForeignKey(PostModel, on_delete=models.CASCADE, related_name="comments")
text = models.TextField(verbose_name="Text")
comment_time = models.DateTimeField(default=datetime.now)
approved = models.BooleanField(default=False)
def approve(self):
self.approved = True
self.save()
def __str__(self):
return self.text
视图:
def user_add_comment(request):
post_pk = request.GET.get('post_pk', None)
post = PostModel.objects.get(pk=post_pk)
user_info = UserProfileInfo.objects.filter(user=request.user)
user_info2 = UserProfileInfo()
for temp_user_info in user_info:
user_info2 = temp_user_info
break
comment_text = request.GET.get('post_text', None)
comment = CommentPostModel(profile_user=user_info2, post=post,
text=comment_text)
comment.save()
data = {
"url": "/profile_page",
}
return JsonResponse(data)
【问题讨论】:
-
您正在尝试使用
user_info2,但尚未保存。你没有打电话给user_info2.save()。你有一个奇怪的for循环与user_info和user_info2交互,你能解释一下为什么需要它吗? -
为什么你的
Comment模型与UserProfileInfo有关系,而不是直接与User模型有关系?这样您就不必在发表评论时创建一个空的用户配置文件。此外,由于您具有一对一的关系,request.user.userprofileinfo将返回关联的配置文件(如果存在)(如果不存在,则提高DoesNotExist,因此您需要抓住它)。这样你就不必做filter的事情了。 -
最简单的方法是将 User 模型与 CommentPostModel 与 OneToOneField 一起使用,这样它们就不会发生更多冲突,然后这也将帮助您有效地访问 userprofile 而不是进行反向关系
标签: django