aboutsummaryrefslogtreecommitdiffstats
path: root/rest_framework/serializers.py
diff options
context:
space:
mode:
authorMarko Tibold2012-11-27 23:21:12 +0100
committerMarko Tibold2012-11-27 23:21:12 +0100
commitf104f7434052bedf6dd970806ff54b73489b339b (patch)
tree1e53e1a3a0ef8da73ff66ad864b9d7c77b45f4b8 /rest_framework/serializers.py
parente7666014a85d65e204b40e1f54911e654f974932 (diff)
downloaddjango-rest-framework-f104f7434052bedf6dd970806ff54b73489b339b.tar.bz2
Moved model validation from .perform_validation() to .validate()
Diffstat (limited to 'rest_framework/serializers.py')
-rw-r--r--rest_framework/serializers.py34
1 files changed, 17 insertions, 17 deletions
diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py
index bb15faa8..5046c7b1 100644
--- a/rest_framework/serializers.py
+++ b/rest_framework/serializers.py
@@ -221,10 +221,17 @@ class BaseSerializer(Field):
except ValidationError as err:
self._errors[field_name] = self._errors.get(field_name, []) + list(err.messages)
- try:
- attrs = self.validate(attrs)
- except ValidationError as err:
- self._errors['non_field_errors'] = err.messages
+ # We don't run .validate() because field-validation failed and thus `attrs` may not be complete.
+ # which in turn can cause inconsistent validation errors.
+ if not self._errors:
+ try:
+ attrs = self.validate(attrs)
+ except ValidationError as err:
+ if hasattr(err, 'message_dict'):
+ for field_name, error_messages in err.message_dict.items():
+ self._errors[field_name] = self._errors.get(field_name, []) + list(error_messages)
+ elif hasattr(err, 'messages'):
+ self._errors['non_field_errors'] = err.messages
return attrs
@@ -451,22 +458,15 @@ class ModelSerializer(Serializer):
except KeyError:
return ModelField(model_field=model_field, **kwargs)
- def from_native(self, data, files):
- restored_object = super(ModelSerializer, self).from_native(data, files)
-
- if restored_object is None:
- return
-
+ def validate(self, attrs):
+ copied_attrs = copy.deepcopy(attrs)
+ restored_object = self.restore_object(copied_attrs, instance=getattr(self, 'object', None))
self.perform_model_validation(restored_object)
- return restored_object
+ return attrs
def perform_model_validation(self, restored_object):
- try:
- # Call Django's full_clean() which in turn calls: Model.clean_fields(), Model.clean(), Model.validat_unique()
- restored_object.full_clean(exclude=list(self.opts.exclude))
- except ValidationError as e:
- for field_name, error_messages in e.message_dict.items():
- self._errors[field_name] = self._errors.get(field_name, []) + list(error_messages)
+ # Call Django's full_clean() which in turn calls: Model.clean_fields(), Model.clean(), Model.validat_unique()
+ restored_object.full_clean(exclude=list(self.opts.exclude))
def restore_object(self, attrs, instance=None):
"""