ForeignKey 不允许为空值。

7 浏览
0 Comments

ForeignKey 不允许为空值。

我正在使用Django REST框架2.0。

这是我的模型类:

class Mission(models.Model):
  assigned_to = models.ForeignKey('auth.User',
                                   related_name='missions_assigned',
                                   blank = True)

这是我的视图类:

class MissionList(generics.ListCreateAPIView):
    model = Mission
    serialize_class = MissionSerializer

  1. 在浏览器中呈现multipart表单,assigned_to字段为空。
  2. 当发布原始JSON时,会收到以下错误消息:

无法分配None:“Mission.assigned_to”不允许空值。

admin 更改状态以发布 2023年5月23日
0
0 Comments

如果设置这种行为,ForeignKey允许有null值。你的代码将会像这样:

class Mission(models.Model):
    assigned_to = models.ForeignKey(
        'auth.User',
        related_name='missions_assigned',
        blank=True,
        null=True
    )

你需要写null=True

注意:在你改变模型后,你需要运行python manage.py makemigrations 你的应用名,然后再运行python manage.py migrate

0
0 Comments

blank选项用于表单验证,而null选项用于写入数据库。

因此,您可以在该字段中添加null=True

编辑:继续评论

考虑保存对象的两个步骤:

  1. 验证器(由blank控制)
  2. 数据库限制(由null控制)

对于default选项,以IntegerField为例,
default=5,blank=True,null=False,即使您没有分配值(具有blank=True),也会传递(1),因为它具有默认值(5),并将5而不是None写入DB。
blank=True,null=False,它通过(1)但不通过(2),因为它试图将None写入DB。

因此,如果要使字段可选,请使用default=SOMETHING,blank=True,null=Falseblank=True,null=True

另一个例外是类似于字符串的字段,例如CharField
建议仅使用blank=True,留下null=False
这使得字段成为字符串(> = 1个字符)或空字符串(' ',长度为0),而不是None

原因是当设置null=True时,"未设置"状态将具有两个可能的值:空字符串和None,这很困惑(可能会导致错误)。

0