Django REST Framework部分更新和验证

时间:2015-02-21 13:39:35

标签: django django-rest-framework

我想对序列化程序执行部分更新。问题是我在对象级别进行了一些验证。因此is_valid()调用总是失败,我无法保存更新的序列化程序。 我可以以某种方式阻止对部分更新的对象级别验证吗? 这是一个代码示例:

class ModelSerializer(serializers.ModelSerializer)
    class Meta:
        model = A
        fields = ('field_b','field_b')

    def validate(self,attrs):
         if attrs.get('field_a') <= attrs.get('field_b'):
             raise serializers.ValidationError('Error')

在我看来,部分更新方法:

class ModelViewSet(viewsets.ModelViewSet):
    def partial_update(self, request, *args, **kwargs):
        instance = self.get_object()
        serializer = self.serialize(instance, data=request.data, partial=True)
    serializer.is_valid(raise_exception=True)
    new_instance = serializer.save()
    return Response(serializer.data)

问题是我无法更新&#39; field_a&#39;没有&#39; field_b&#39;。 谢谢你的帮助!

2 个答案:

答案 0 :(得分:8)

self.instance是如何访问验证器中的实例。以下是汤姆答案的主旨:一个例子:

def validate_my_field(self, value):
    """ Can't modify field's value after initial save """
    if self.instance and self.instance.my_field != value:
        raise serializers.ValidationError("changing my_field not allowed")
    return value

答案 1 :(得分:0)

你可以使用&#34; partial&#34;参数以允许部分更新: http://www.django-rest-framework.org/api-guide/serializers/#partial-updates