diff options
| author | Tom Christie | 2012-10-24 04:16:11 -0700 |
|---|---|---|
| committer | Tom Christie | 2012-10-24 04:16:11 -0700 |
| commit | 9a741e7ddb756eece1b7b2cca8620db052c57309 (patch) | |
| tree | b04c90dd1e15b09d76bf0ae83199bf62742b7231 /rest_framework/serializers.py | |
| parent | 5d76f03ac6f4937aa4f52d43ddb8d014ff632780 (diff) | |
| parent | 607c31c6d880501e5dc524fc5a5e1fc136b162fc (diff) | |
| download | django-rest-framework-9a741e7ddb756eece1b7b2cca8620db052c57309.tar.bz2 | |
Merge pull request #318 from j4mie/field-validation
Implement per-field validation on Serializers
Diffstat (limited to 'rest_framework/serializers.py')
| -rw-r--r-- | rest_framework/serializers.py | 31 |
1 files changed, 30 insertions, 1 deletions
diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py index 221cbf2f..c9f025bc 100644 --- a/rest_framework/serializers.py +++ b/rest_framework/serializers.py @@ -208,6 +208,34 @@ class BaseSerializer(Field): return reverted_data + def perform_validation(self, attrs): + """ + Run `validate_<fieldname>()` and `validate()` methods on the serializer + """ + fields = self.get_fields(serialize=False, data=attrs, nested=self.opts.nested) + + for field_name, field in fields.items(): + try: + validate_method = getattr(self, 'validate_%s' % field_name, None) + if validate_method: + source = field.source or field_name + attrs = validate_method(attrs, source) + 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 + + return attrs + + def validate(self, attrs): + """ + Stub method, to be overridden in Serializer subclasses + """ + return attrs + def restore_object(self, attrs, instance=None): """ Deserialize a dictionary of attributes into an object instance. @@ -241,8 +269,9 @@ class BaseSerializer(Field): self._errors = {} if data is not None: attrs = self.restore_fields(data) + attrs = self.perform_validation(attrs) else: - self._errors['non_field_errors'] = 'No input provided' + self._errors['non_field_errors'] = ['No input provided'] if not self._errors: return self.restore_object(attrs, instance=getattr(self, 'object', None)) |
