diff --git a/rest_framework/genericrelations.py b/rest_framework/genericrelations.py index 5a20b5296..c193c12eb 100644 --- a/rest_framework/genericrelations.py +++ b/rest_framework/genericrelations.py @@ -51,7 +51,10 @@ class GenericRelatedField(serializers.WritableField): def from_native(self, value): # Get the serializer responsible for input resolving - serializer = self.determine_serializer_for_data(value) + try: + serializer = self.determine_serializer_for_data(value) + except ConfigurationError as e: + raise ValidationError(e) serializer.initialize(self.parent, self.source) return serializer.from_native(value) @@ -73,12 +76,12 @@ class GenericRelatedField(serializers.WritableField): serializer.from_native(value) # Collects all serializers that can handle the input data. serializers.append(serializer) - except Exception: + except: pass # If no serializer found, raise error. l = len(serializers) if l < 1: - raise ConfigurationError('Could not determine a valid serializer for value "%r"' % value) + raise ConfigurationError('Could not determine a valid serializer for value %r.' % value) elif l > 1: - raise ConfigurationError('There were multiple serializers found for value "%r"' % value) + raise ConfigurationError('There were multiple serializers found for value %r.' % value) return serializers[0] diff --git a/rest_framework/tests/relations_generic.py b/rest_framework/tests/relations_generic.py index 18899f624..1873b5b6a 100644 --- a/rest_framework/tests/relations_generic.py +++ b/rest_framework/tests/relations_generic.py @@ -243,7 +243,9 @@ class TestGenericRelatedFieldSerialization(TestCase): 'tag': 'reminder', 'tagged_item': 'just a string' }) - self.assertRaises(ConfigurationError, serializer.is_valid) + + with self.assertRaises(ConfigurationError): + serializer.fields['tagged_item'].determine_serializer_for_data('just a string') def test_not_registered_view_name(self): class TagSerializer(serializers.ModelSerializer): @@ -262,7 +264,7 @@ class TestGenericRelatedFieldSerialization(TestCase): self.assertFalse(serializer.is_valid()) def test_invalid_url(self): - # Should fail ATM + class TagSerializer(serializers.ModelSerializer): tagged_item = GenericRelatedField({ Bookmark: serializers.HyperlinkedRelatedField(view_name='bookmark-detail'), @@ -276,7 +278,13 @@ class TestGenericRelatedFieldSerialization(TestCase): 'tag': 'reminder', 'tagged_item': 'foo-bar' }) + + expected = { + 'tagged_item': ['Could not determine a valid serializer for value %r.' % 'foo-bar'] + } + self.assertFalse(serializer.is_valid()) + self.assertEqual(expected, serializer.errors) def test_serializer_save(self): class TagSerializer(serializers.ModelSerializer):