From 557d75eabad7cd37cc7630e0be75fb256b212d73 Mon Sep 17 00:00:00 2001 From: Vincent Gao Date: Sat, 27 Jun 2026 10:56:50 +0200 Subject: [PATCH] Handle custom field validation errors --- rest_framework_friendly_errors/mixins.py | 4 ++-- tests/test_serializers.py | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/rest_framework_friendly_errors/mixins.py b/rest_framework_friendly_errors/mixins.py index c535600..6139517 100644 --- a/rest_framework_friendly_errors/mixins.py +++ b/rest_framework_friendly_errors/mixins.py @@ -165,8 +165,8 @@ def get_field_error_entry(self, error, field): 'message': error} # Here we know that error was raised by custom validate method # in serializer - validator = getattr(self, "validate_%s" % field.field_name) - if self._run_validator(validator, field, error): + validator = getattr(self, "validate_%s" % field.field_name, None) + if validator and self._run_validator(validator, field, error): name = validator.__name__ code = self.FIELD_VALIDATION_ERRORS.get(name) or settings.FRIENDLY_VALIDATOR_ERRORS.get(name) return {'code': code, 'field': field.field_name, diff --git a/tests/test_serializers.py b/tests/test_serializers.py index c031eff..7a70918 100644 --- a/tests/test_serializers.py +++ b/tests/test_serializers.py @@ -13,6 +13,19 @@ class SimpleSerializerClass(FriendlyErrorMessagesMixin, serializers.Serializer): boolean_field = serializers.BooleanField(default=True) +class CustomField(serializers.Field): + + def to_internal_value(self, data): + raise serializers.ValidationError('Custom field error') + + def to_representation(self, value): + return value + + +class CustomFieldSerializer(FriendlyErrorMessagesMixin, serializers.Serializer): + custom = CustomField() + + class SanityTestCase(BaseTestCase): def test_serializer_valid(self): @@ -151,6 +164,12 @@ def test_custom_field_validation_using_validators(self): self.assertEqual(s.errors['errors'][0]['field'], 'title') self.assertEqual(s.errors['errors'][0]['code'], 5001) + def test_custom_field_validation_error_without_validate_method(self): + s = run_is_valid(CustomFieldSerializer, data={'custom': 'invalid'}) + self.assertEqual(s.errors['errors'][0]['field'], 'custom') + self.assertEqual(s.errors['errors'][0]['message'], + 'Custom field error') + def test_field_dependency_validation(self): self.data_set['title'] = 'A Python' self.data_set['language'] = 'c++'