66

我正在使用 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. 多部分表单在浏览器中呈现,字段选择为空assigned_to

  2. 发布原始 JSON 时,我收到以下错误消息:

Cannot assign None: "Mission.assigned_to" does not allow null values.

4

4 回答 4

136

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

因此,您可以添加null=True到该字段。

编辑:继续评论

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

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

对于default选项,IntegerField例如,
default=5, blank=True, null=False即使您没有分配值(具有blank=True),也传递(1),传递(2),因为它具有默认值(5)并且写入5而不是写入None数据库。
blank=True, null=False,通过 (1) 但不通过 (2),因为它尝试写入NoneDB。

因此,如果您想使某个字段成为可选字段,请使用default=SOMETHING, blank=True, null=Falseblank=True, null=True

另一个例外是类似字符串的字段,例如CharField.
建议blank=True 单独使用,留下null=False
这使得字段要么是字符串(>=1 char(s)),要么是空字符串('',带有 len()==0),并且从不None

原因是当null=True被设置时,状态“未设置”将有两个可能的值:空字符串和None,这是令人困惑的(并且可能导致错误)。

于 2013-05-16T13:44:35.380 回答
23

如果设置了此行为,ForeignKey 允许空值。您的代码将如下所示:

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

你必须写null=True

注意:更改模型后,需要运行python manage.py makemigrations yourappname,然后python manage.py migrate

于 2018-01-09T14:47:06.397 回答
2

更改模型并允许 null 的解决方案:

blank=True,
null=True

对我来说还不够。

我能够通过将序列化程序中的 required 设置为 false 来解决该问题,例如

field = MyModelSerializer(required=False)

如此处所述(Django ForeignKey field required 尽管 blank=True and null=True)

我最终都做了。在模型中允许 null withblank=True, null=True并且不需要序列化程序中的字段required=False

于 2020-08-20T05:27:14.277 回答
1

就我而言,required=False还不够。我需要allow_null在序列化程序中,每个 Django ForeignKey 字段都需要,尽管 blank=True 和 null=True

于 2020-10-08T21:56:23.090 回答