ForeignKey不允许空值

时间:2013-05-16 13:40:19

标签: 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)

这是我的观点类:

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

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

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

4 个答案:

答案 0 :(得分:74)

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

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

编辑:继续发表评论

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

  1. 验证者(由blank控制)
  2. 数据库限制(由null控制)
  3. 对于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个字符(s))或空字符串('',len()== 0),而不是None

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

答案 1 :(得分:4)

如果设置了此行为,则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

答案 2 :(得分:0)

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

blank=True,
null=True

对我来说还不够。

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

field = MyModelSerializer(required=False)

here (Django ForeignKey field required despite blank=True and null=True)所述。

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

答案 3 :(得分:0)

就我而言,required=False还不够。我需要per Django ForeignKey field required despite blank=True and null=True序列化程序中的allow_null