aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTom Christie2013-01-04 14:11:05 +0000
committerTom Christie2013-01-04 14:11:05 +0000
commit26f9acb45ac0dcd1363399f518834c56d3f9984d (patch)
tree3a1a5dc94e2fc9af78aea22cee1a7d8559efb99b
parenteb14278a3b08247c0aff5b2338a98203b51728c3 (diff)
downloaddjango-rest-framework-26f9acb45ac0dcd1363399f518834c56d3f9984d.tar.bz2
Validation errors instead of exceptions when serializers receive incorrect types. Fixes #402.
-rw-r--r--docs/topics/release-notes.md1
-rw-r--r--rest_framework/serializers.py7
-rw-r--r--rest_framework/tests/serializer.py20
3 files changed, 27 insertions, 1 deletions
diff --git a/docs/topics/release-notes.md b/docs/topics/release-notes.md
index 40b65761..eff7314b 100644
--- a/docs/topics/release-notes.md
+++ b/docs/topics/release-notes.md
@@ -18,6 +18,7 @@ Major version numbers (x.0.0) are reserved for project milestones. No major poi
### Master
+* Bugfix: Validation errors instead of exceptions when serializers receive incorrect types.
* Bugfix: Validation errors instead of exceptions when related fields receive incorrect types.
### 2.1.15
diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py
index bd54db4c..fa92838b 100644
--- a/rest_framework/serializers.py
+++ b/rest_framework/serializers.py
@@ -208,6 +208,11 @@ class BaseSerializer(Field):
Converts a dictionary of data into a dictionary of deserialized fields.
"""
reverted_data = {}
+
+ if data is not None and not isinstance(data, dict):
+ self._errors['non_field_errors'] = [u'Invalid data']
+ return None
+
for field_name, field in self.fields.items():
field.initialize(parent=self, field_name=field_name)
try:
@@ -276,7 +281,7 @@ class BaseSerializer(Field):
"""
if hasattr(data, '__iter__') and not isinstance(data, dict):
# TODO: error data when deserializing lists
- return (self.from_native(item) for item in data)
+ return [self.from_native(item, None) for item in data]
self._errors = {}
if data is not None or files is not None:
diff --git a/rest_framework/tests/serializer.py b/rest_framework/tests/serializer.py
index 8767385e..bd96ba23 100644
--- a/rest_framework/tests/serializer.py
+++ b/rest_framework/tests/serializer.py
@@ -69,6 +69,7 @@ class AlbumsSerializer(serializers.ModelSerializer):
model = Album
fields = ['title'] # lists are also valid options
+
class PositiveIntegerAsChoiceSerializer(serializers.ModelSerializer):
class Meta:
model = HasPositiveIntegerAsChoice
@@ -240,6 +241,25 @@ class ValidationTests(TestCase):
self.assertFalse(serializer.is_valid())
self.assertEquals(serializer.errors, {'content': [u'Test not in value']})
+ def test_bad_type_data_is_false(self):
+ """
+ Data of the wrong type is not valid.
+ """
+ data = ['i am', 'a', 'list']
+ serializer = CommentSerializer(self.comment, data=data)
+ self.assertEquals(serializer.is_valid(), False)
+ self.assertEquals(serializer.errors, {'non_field_errors': [u'Invalid data']})
+
+ data = 'and i am a string'
+ serializer = CommentSerializer(self.comment, data=data)
+ self.assertEquals(serializer.is_valid(), False)
+ self.assertEquals(serializer.errors, {'non_field_errors': [u'Invalid data']})
+
+ data = 42
+ serializer = CommentSerializer(self.comment, data=data)
+ self.assertEquals(serializer.is_valid(), False)
+ self.assertEquals(serializer.errors, {'non_field_errors': [u'Invalid data']})
+
def test_cross_field_validation(self):
class CommentSerializerWithCrossFieldValidator(CommentSerializer):