【问题标题】:IntegrityError : NOT NULL constraint failed with OneToOneFieldsIntegrityError:NOT NULL 约束因 OneToOneFields 而失败
【发布时间】:2016-03-30 00:40:55
【问题描述】:

我正在尝试用 django 制作一些表单。

我做了一些模型:

class Identity(models.Model):
    [...]

class Move(models.Model):
    identity = models.OneToOneField(Identity, blank=True)
    [...]

还有一个观点:

def firstform(request):
    forms = {}
    if request.method == "POST":
        forms["move_form"] = MoveForm(request.POST)
        forms["identity_form"] = IdentityForm(request.POST)
        if all((forms["move_form"].is_valid(),
                forms["identity_form"].is_valid())):
            forms["identity_form"].save()
            forms["move_form"].identity = forms["identity_form"]
            forms["move_form"].save()
            return HttpResponse("OK")
    else:
        forms["move_form"] = MoveForm()
        forms["identity_form"] = IdentityForm()
    return (render(request, "main/devis.html", forms))

但是,当我尝试提交表单时,我收到了 django.db.utils.IntegrityError: NOT NULL constraint failed: main_move.identity_id

我该如何解决这个问题?

【问题讨论】:

  • 我在您的代码中的任何地方都没有看到main_move——也许您可以发布出现此错误的更新代码?
  • @gorus main 是应用的名称,移动类的名称,estimate_query 一个字段的名称:我弄错了两个字段,我的错!问题不在于身份字段。 编辑 没关系,我更正了有关估计查询的问题,并且在身份方面遇到了同样的错误。 (我编辑了帖子)

标签: django python-3.x django-forms


【解决方案1】:

我相信您需要明确分配身份实例,而不是保存的表单:

identity = forms["identity_form"].save()
forms["move_form"].identity = identity
forms["move_form"].save()

【讨论】:

  • 不是这个,两种符号都可以,但这个对我来说似乎很有用(代码更少)。
【解决方案2】:

我找到了答案,我只需在我的Move 类中将blank=True 替换为null=True。我的错:这很愚蠢。

【讨论】:

    【解决方案3】:

    当您调用表单的save() 方法时,它会返回实例。您应该将identity 分配给move 实例,而不是移动表单。

    其次,在保存移动表单时使用commit=False。这意味着实例未保存到数据库中,因此您不会得到IntegrityError。这样,如果您希望所有身份都移动,您可以在模型中保留 null=False

        forms["move_form"] = MoveForm(request.POST)
        forms["identity_form"] = IdentityForm(request.POST)
        if all((forms["move_form"].is_valid(),
                forms["identity_form"].is_valid())):
            move = forms["move_form"].save(commit=False)
            identity = forms["identity_form"].save()
            move.identity = identity
            move.save()
            # It's usually a good idea to redirect here rather than
            # returning a response
            return HttpResponse("OK")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-02
      • 2016-09-09
      • 2019-07-10
      • 1970-01-01
      • 1970-01-01
      • 2016-04-07
      • 1970-01-01
      • 2015-04-22
      相关资源
      最近更新 更多