aboutsummaryrefslogtreecommitdiffstats
path: root/rest_framework/serializers.py
diff options
context:
space:
mode:
authorTom Christie2013-02-04 20:37:09 +0000
committerTom Christie2013-02-04 20:37:09 +0000
commit8e846bdf52f03d0733ac73e418152800e582b898 (patch)
treecd7034d5573f1e264798a618c88addc4d2f45ce0 /rest_framework/serializers.py
parentd9b73e15c87c3a7f11d6bea5ffd6118f86e40051 (diff)
parent97f2b994951605ffdef08159be450d1e77762bf9 (diff)
downloaddjango-rest-framework-8e846bdf52f03d0733ac73e418152800e582b898.tar.bz2
Merge branch 'py3k' into 2.2
Conflicts: rest_framework/relations.py rest_framework/serializers.py rest_framework/tests/relations_hyperlink.py rest_framework/tests/relations_slug.py
Diffstat (limited to 'rest_framework/serializers.py')
-rw-r--r--rest_framework/serializers.py23
1 files changed, 17 insertions, 6 deletions
diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py
index 6b2a8368..c5b3494c 100644
--- a/rest_framework/serializers.py
+++ b/rest_framework/serializers.py
@@ -7,6 +7,7 @@ from django.db import models
from django.forms import widgets
from django.utils.datastructures import SortedDict
from rest_framework.compat import get_concrete_model
+from rest_framework.compat import six
# Note: We do the following so that users of the framework can use this style:
#
@@ -64,7 +65,7 @@ def _get_declared_fields(bases, attrs):
Note that all fields from the base classes are used.
"""
fields = [(field_name, attrs.pop(field_name))
- for field_name, obj in attrs.items()
+ for field_name, obj in list(six.iteritems(attrs))
if isinstance(obj, Field)]
fields.sort(key=lambda x: x[1].creation_counter)
@@ -73,7 +74,7 @@ def _get_declared_fields(bases, attrs):
# in order to maintain the correct order of fields.
for base in bases[::-1]:
if hasattr(base, 'base_fields'):
- fields = base.base_fields.items() + fields
+ fields = list(base.base_fields.items()) + fields
return SortedDict(fields)
@@ -200,7 +201,7 @@ class BaseSerializer(Field):
reverted_data = {}
if data is not None and not isinstance(data, dict):
- self._errors['non_field_errors'] = [u'Invalid data']
+ self._errors['non_field_errors'] = ['Invalid data']
return None
for field_name, field in self.fields.items():
@@ -278,6 +279,10 @@ class BaseSerializer(Field):
"""
Deserialize primitives -> objects.
"""
+ if hasattr(data, '__iter__') and not isinstance(data, (dict, six.text_type)):
+ # TODO: error data when deserializing lists
+ return [self.from_native(item, None) for item in data]
+
self._errors = {}
if data is not None or files is not None:
attrs = self.restore_fields(data, files)
@@ -379,8 +384,8 @@ class BaseSerializer(Field):
return self.object
-class Serializer(BaseSerializer):
- __metaclass__ = SerializerMetaclass
+class Serializer(six.with_metaclass(SerializerMetaclass, BaseSerializer)):
+ pass
class ModelSerializerOptions(SerializerOptions):
@@ -544,7 +549,7 @@ class ModelSerializer(Serializer):
"""
try:
instance.full_clean(exclude=self.get_validation_exclusions())
- except ValidationError, err:
+ except ValidationError as err:
self._errors = err.message_dict
return None
return instance
@@ -580,6 +585,12 @@ class ModelSerializer(Serializer):
else:
instance = self.opts.model(**attrs)
+ try:
+ instance.full_clean(exclude=self.get_validation_exclusions())
+ except ValidationError as err:
+ self._errors = err.message_dict
+ return None
+
return instance
def from_native(self, data, files):