diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py index 99d36a8a54..ada1c16204 100644 --- a/rest_framework/serializers.py +++ b/rest_framework/serializers.py @@ -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): diff --git a/tests/test_validation.py b/tests/test_validation.py index 855ff20e01..b6f274219f 100644 --- a/tests/test_validation.py +++ b/tests/test_validation.py @@ -49,6 +49,24 @@ class Meta: 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): """