我正在使用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
多部分表单在浏览器中呈现,assigned_to
字段为空。
发布原始JSON时,收到以下错误消息:
Cannot assign None: "Mission.assigned_to" does not allow null values.
答案 0 :(得分:74)
表单验证中使用blank
选项,写入数据库时使用null
。
因此,您可以将null=True
添加到该字段。
编辑:继续发表评论
考虑保存对象时的两个步骤:
blank
控制)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=False
或blank=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
。