diff --git a/rest_framework/fields.py b/rest_framework/fields.py index 6caae9242..8e30e77a3 100644 --- a/rest_framework/fields.py +++ b/rest_framework/fields.py @@ -429,6 +429,11 @@ class ModelField(WritableField): "type": self.model_field.get_internal_type() } + def validate(self, value): + super(ModelField, self).validate(value) + if value is None and not self.model_field.null: + raise ValidationError(self.error_messages['invalid']) + ##### Typed Fields ##### @@ -474,10 +479,7 @@ class CharField(WritableField): self.validators.append(validators.MaxLengthValidator(max_length)) def from_native(self, value): - if isinstance(value, six.string_types): - return value - - if value is None: + if value in validators.EMPTY_VALUES: return '' return smart_text(value) diff --git a/rest_framework/relations.py b/rest_framework/relations.py index 3463954dc..df17a8606 100644 --- a/rest_framework/relations.py +++ b/rest_framework/relations.py @@ -33,7 +33,7 @@ class RelatedField(WritableField): many_widget = widgets.SelectMultiple form_field_class = forms.ChoiceField many_form_field_class = forms.MultipleChoiceField - null_values = (None, '', 'None') + null_values = (None, '', 'None', [], (), {}) cache_choices = False empty_label = None @@ -182,7 +182,7 @@ class RelatedField(WritableField): if value in self.null_values: if self.required: raise ValidationError(self.error_messages['required']) - into[(self.source or field_name)] = None + into[(self.source or field_name)] = [] if self.many else None elif self.many: into[(self.source or field_name)] = [self.from_native(item) for item in value] else: