Fix nested validation error being rendered incorrectly.

Previously an extra list wrapped nested validation errors raised from serializer's validate() methods.
That was inconsistent with the format of validation errors raised by validate_<fieldname> methods.
i.e. these two resulted in *different* behaviour:

    def validate_foo(self):
        raise ValidationError(['bar'])

    def validate(self):
        raise ValidationError({'foo': ['bar']})
This commit is contained in:
Craig de Stigter 2016-01-06 16:04:23 +13:00
parent 37f7b76f72
commit 651319e2da
2 changed files with 19 additions and 1 deletions

View File

@ -306,7 +306,7 @@ def get_validation_error_detail(exc):
# If errors may be a dict we use the standard {key: list of values}.
# Here we ensure that all the values are *lists* of errors.
return {
key: value if isinstance(value, list) else [value]
key: value if isinstance(value, (list, dict)) else [value]
for key, value in exc.detail.items()
}
elif isinstance(exc.detail, list):

View File

@ -49,6 +49,24 @@ class ShouldValidateModelSerializer(serializers.ModelSerializer):
fields = ('renamed',)
class TestNestedValidationError(TestCase):
def test_nested_validation_error_detail(self):
"""
Ensure nested validation error detail is rendered correctly.
"""
e = serializers.ValidationError({
'nested': {
'field': ['error'],
}
})
self.assertEqual(serializers.get_validation_error_detail(e), {
'nested': {
'field': ['error'],
}
})
class TestPreSaveValidationExclusionsSerializer(TestCase):
def test_renamed_fields_are_model_validated(self):
"""