【问题标题】:How to save an object of model that have one to one field?如何保存具有一对一字段的模型对象?
【发布时间】: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_infouser_info2 交互,你能解释一下为什么需要它吗?
  • 为什么你的Comment 模型与UserProfileInfo 有关系,而不是直接与User 模型有关系?这样您就不必在发表评论时创建一个空的用户配置文件。此外,由于您具有一对一的关系,request.user.userprofileinfo 将返回关联的配置文件(如果存在)(如果不存在,则提高DoesNotExist,因此您需要抓住它)。这样你就不必做filter 的事情了。
  • 最简单的方法是将 User 模型与 CommentPostModel 与 OneToOneField 一起使用,这样它们就不会发生更多冲突,然后这也将帮助您有效地访问 userprofile 而不是进行反向关系

标签: django


【解决方案1】:

您没有保存 user_info2 对象。所以改成这样:

for temp_user_info in user_info:
         user_info2 = temp_user_info
         user_info2.save()

编辑

根据您的要求,您可以像这样更改您的代码

def user_add_comment(request):
      post_pk = request.GET.get('post_pk', None)
      post = PostModel.objects.get(pk=post_pk)
      user_info = UserProfileInfo.objects.get(user=request.user)
      comment_text = request.GET.get('post_text', None)
      comment = CommentPostModel(profile_user=user_info, post=post, 
                                 text=comment_text
                                )
      comment.save()
      data = {
      "url": "/profile_page",
      }
      return JsonResponse(data)

【讨论】:

  • 它不是需要保存的 forloop 中的那个(它已经是),如果循环没有任何需要保存的元素。
  • 我想得到一个用户字段是这个用户的记录。所以我使用过滤器并使用 for 循环来获得这个也是唯一的记录。你有别的想法吗?我可以使用(user_info = UserProfileInfo.objects.filter(user=request.user).first())吗?
  • 这个用户是什么意思?它是“登录用户”吗?你想实现评论系统吗?
猜你喜欢
  • 2020-11-15
  • 2013-06-04
  • 1970-01-01
  • 2014-11-10
  • 1970-01-01
  • 2019-06-16
  • 2018-06-06
  • 2020-08-01
  • 1970-01-01
相关资源
最近更新 更多