ForeignKey不允许空值

2024-05-19 12:52:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用的是Django REST Framework 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.


Tags: todjangonameauthrestmodelmodelsframework
2条回答

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

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

你必须写{}。

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

在表单验证中使用blank选项,在写入数据库时使用null

所以您可以将null=True添加到该字段。

编辑:继续评论

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

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

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

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

另一个例外是类似字符串的字段,例如CharField
建议单独使用blank=True,而不使用null=False
这使得字段要么是字符串(>;=1个字符)要么是空字符串('',len()==0),并且永远不会None

原因是,当设置了null=True时,状态“unset”可能有两个值:空字符串和None,这很容易混淆(并且可能导致错误)。

相关问题 更多 >