我正在尝试使用partial=True
部分更新实例,但无论哪个属性丢失,我都会收到错误This field cannot be blank.
。我认为partial=True
可以实现部分更新。我在这里错过了什么吗?
class MySerializer(serializers.ModelSerializer):
class Meta:
model = MyModel
fields = ('meta_name', 'meta_num_files', 'meta_total_length')
...
class MyViewClass(APIView):
def post(self, request):
instance = get_object_or_404(MyModel, foo='foo')
...
serializer = MySerializer(instance, data, partial=True)
...
self.client.post(reverse('api_meta', data={'meta_name': '',
'meta_total_length': 1000000,
'meta_num_files': 10
}
)
答案 0 :(得分:2)
部分更新(您只更新序列化程序中字段的子集)和非必填字段之间存在差异,其中值可以为空。
使用部分更新时,客户端只能在序列化程序中发送字段的子集,并且序列化程序不需要不存在的字段。这具有跳过某些验证的副作用,但是它期望未包含在请求中的字段已经存在于模型上。 仅验证通过请求传递的字段,并且仅在模型上更新这些字段。
您传入的是空白值,而不是根本没有传入密钥。这相当于执行尝试清除字段值的更新,这在部分更新情况下是完全正常的,因此Django REST Framework将在空白字段上运行验证。这似乎没有在任何地方记录,但这就是Django REST Framework如何确定运行验证的字段。
因为您的字段没有指定empty=True
,Django REST Framework将意识到它是必填字段,不能为空。这就是为什么你收到This field cannot be blank
的错误,你告诉它清除该字段的值。