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)
多部分表单在浏览器中呈现,assigned_to字段为空.
发布原始JSON时,我收到以下错误消息:
Cannot assign None: "Mission.assigned_to" does not allow null values.
use*_*937 85
该blank选项用于表单验证,并null在写入数据库时使用.
所以你可以添加null=True到该字段.
编辑:继续评论
考虑保存对象时的两个步骤:
blank)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=False或blank=True, null=True.
另一个例外是字符串式字段,例如CharField.
建议blank=True 单独使用,留下null=False.
这使得字段可以是字符串(> = 1个字符(s))或空字符串('',len()== 0),而且永远不会None.
原因是当null=True设置时,状态"unset"将有两个可能的值:空字符串None,这是令人困惑的(并可能导致错误).
更改模型并允许 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
| 归档时间: |
|
| 查看次数: |
54252 次 |
| 最近记录: |