Commit 1addd09e by Anton Shutik

RelatedField default value handling fixed

parent 6e92e415
...@@ -301,6 +301,11 @@ class WritableField(Field): ...@@ -301,6 +301,11 @@ class WritableField(Field):
result.validators = self.validators[:] result.validators = self.validators[:]
return result return result
def get_default_value(self):
if is_simple_callable(self.default):
return self.default()
return self.default
def validate(self, value): def validate(self, value):
if value in validators.EMPTY_VALUES and self.required: if value in validators.EMPTY_VALUES and self.required:
raise ValidationError(self.error_messages['required']) raise ValidationError(self.error_messages['required'])
...@@ -349,10 +354,7 @@ class WritableField(Field): ...@@ -349,10 +354,7 @@ class WritableField(Field):
except KeyError: except KeyError:
if self.default is not None and not self.partial: if self.default is not None and not self.partial:
# Note: partial updates shouldn't set defaults # Note: partial updates shouldn't set defaults
if is_simple_callable(self.default): native = self.get_default_value()
native = self.default()
else:
native = self.default
else: else:
if self.required: if self.required:
raise ValidationError(self.error_messages['required']) raise ValidationError(self.error_messages['required'])
......
...@@ -118,6 +118,13 @@ class RelatedField(WritableField): ...@@ -118,6 +118,13 @@ class RelatedField(WritableField):
choices = property(_get_choices, _set_choices) choices = property(_get_choices, _set_choices)
### Default value handling
def get_default_value(self):
default = super(RelatedField, self).get_default_value()
return default or \
[] if self.many else None
### Regular serializer stuff... ### Regular serializer stuff...
def field_to_native(self, obj, field_name): def field_to_native(self, obj, field_name):
...@@ -166,7 +173,7 @@ class RelatedField(WritableField): ...@@ -166,7 +173,7 @@ class RelatedField(WritableField):
except KeyError: except KeyError:
if self.partial: if self.partial:
return return
value = [] if self.many else None value = self.get_default_value()
if value in (None, '') and self.required: if value in (None, '') and self.required:
raise ValidationError(self.error_messages['required']) raise ValidationError(self.error_messages['required'])
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment