如何正确部分更新?

时间:2014-11-30 19:47:00

标签: django django-rest-framework

我正在尝试使用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
                                          }
                                    )

1 个答案:

答案 0 :(得分:2)

部分更新(您只更新序列化程序中字段的子集)和非必填字段之间存在差异,其中值可以为空。

使用部分更新时,客户端只能在序列化程序中发送字段的子集,并且序列化程序不需要不存在的字段。这具有跳过某些验证的副作用,但是它期望未包含在请求中的字段已经存在于模型上。 仅验证通过请求传递的字段,并且仅在模型上更新这些字段。

您传入的是空白值,而不是根本没有传入密钥。这相当于执行尝试清除字段值的更新,这在部分更新情况下是完全正常的,因此Django REST Framework将在空白字段上运行验证。这似乎没有在任何地方记录,但这就是Django REST Framework如何确定运行验证的字段。

因为您的字段没有指定empty=True,Django REST Framework将意识到它是必填字段,不能为空。这就是为什么你收到This field cannot be blank的错误,你告诉它清除该字段的值。