diff options
| author | Tom Christie | 2012-12-15 20:40:41 +0000 |
|---|---|---|
| committer | Tom Christie | 2012-12-15 20:40:41 +0000 |
| commit | 35f72cecb199e1790a42fadd6037da43cdd5a05a (patch) | |
| tree | 2cc58cb4f1b03de86eca022fccb59b5174b0b716 /rest_framework/serializers.py | |
| parent | 1d24d1fc5928d32372e700907aa71cf887b16ba9 (diff) | |
| download | django-rest-framework-35f72cecb199e1790a42fadd6037da43cdd5a05a.tar.bz2 | |
Fix model validation exclusions. Fixes #500. Fixes #506.
Diffstat (limited to 'rest_framework/serializers.py')
| -rw-r--r-- | rest_framework/serializers.py | 25 |
1 files changed, 13 insertions, 12 deletions
diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py index 8026205e..1d93f777 100644 --- a/rest_framework/serializers.py +++ b/rest_framework/serializers.py @@ -128,17 +128,6 @@ class BaseSerializer(Field): """ return {} - def get_excluded_fieldnames(self): - """ - Returns the fieldnames that should not be validated. - """ - excluded_fields = list(self.opts.exclude) - if self.opts.fields: - for field in self.fields.keys() + self.get_default_fields().keys(): - if field not in list(self.opts.fields) + excluded_fields: - excluded_fields.append(field) - return excluded_fields - def get_fields(self): """ Returns the complete set of fields for the object as a dict. @@ -491,6 +480,18 @@ class ModelSerializer(Serializer): except KeyError: return ModelField(model_field=model_field, **kwargs) + def get_validation_exclusions(self): + """ + Return a list of field names to exclude from model validation. + """ + cls = self.opts.model + opts = get_concrete_model(cls)._meta + exclusions = [field.name for field in opts.fields + opts.many_to_many] + for field_name, field in self.fields.items(): + if field_name in exclusions and not field.read_only: + exclusions.remove(field_name) + return exclusions + def restore_object(self, attrs, instance=None): """ Restore the model instance. @@ -515,7 +516,7 @@ class ModelSerializer(Serializer): instance = self.opts.model(**attrs) try: - instance.full_clean(exclude=list(self.get_excluded_fieldnames())) + instance.full_clean(exclude=self.get_validation_exclusions()) except ValidationError, err: self._errors = err.message_dict return None |
