ForeignKey不允许空值

Ben*_*ueg 33 django django-rest-framework

我正在使用Django REST Framework 2.0.

这是我的模型类:

class Mission(models.Model):
    assigned_to = models.ForeignKey('auth.User',
                                    related_name='missions_assigned',
                                    blank = True)
Run Code Online (Sandbox Code Playgroud)

这是我的观点类:

class MissionList(generics.ListCreateAPIView):
    model = Mission
    serialize_class = MissionSerializer
Run Code Online (Sandbox Code Playgroud)
  1. 多部分表单在浏览器中呈现,assigned_to字段为空.

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

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

use*_*937 85

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

所以你可以添加null=True到该字段.

编辑:继续评论

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

  1. 验证者(受控制blank)
  2. 数据库限制(受控制null)

对于default选项,IntegerField例如,
default=5, blank=True, null=False即使您没有分配值(有blank=True),也传递(1),传递(2)因为它有一个默认值(5)而5不是写入NoneDB.
blank=True, null=False传递(1)但不传递(2),因为它试图写入NoneDB.

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

另一个例外是字符串式字段,例如CharField.
建议blank=True 单独使用,留下null=False.
这使得字段可以是字符串(> = 1个字符(s))或空字符串('',len()== 0),而且永远不会None.

原因是当null=True设置时,状态"unset"将有两个可能的值:空字符串None,这是令人困惑的(并可能导致错误).

  • 但是,有两个例外,`default`选项和类似字符串的字段.(我想在帖子之后添加,而不是在这里添加评论.) (2认同)

fsu*_*ser 8

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

blank=True,
null=True
Run Code Online (Sandbox Code Playgroud)

对我来说还不够。

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

field = MyModelSerializer(required=False)
Run Code Online (Sandbox Code Playgroud)

如此处所述(尽管有 Blank=True 和 null=True,但仍需要 DjangoForeignKey 字段)

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


小智 7

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

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

你必须写null=True

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