This commit is contained in:
COCOLMAN 2017-06-05 10:38:03 +00:00 committed by GitHub
commit e9be6f4183
2 changed files with 27 additions and 19 deletions

View File

@ -424,7 +424,7 @@ class Field(object):
if getattr(self.root, 'partial', False): if getattr(self.root, 'partial', False):
return empty return empty
return self.default_empty_html return self.default_empty_html
ret = dictionary[self.field_name] ret = dictionary.getlist(self.field_name)
if ret == '' and self.allow_null: if ret == '' and self.allow_null:
# If the field is blank, and null is a valid value then # If the field is blank, and null is a valid value then
# determine if we should use null instead. # determine if we should use null instead.

View File

@ -367,10 +367,15 @@ class Serializer(BaseSerializer):
@cached_property @cached_property
def _writable_fields(self): def _writable_fields(self):
return [ ret = []
field for field in self.fields.values() for field in self.fields.values():
if (not field.read_only) or (field.default is not empty) if re.compile("\_set$").findall(field.source):
] for field in field.child._writable_fields:
ret.append(field)
continue
if (not field.read_only) or (field.default is not empty):
ret.append(field)
return ret
@cached_property @cached_property
def _readable_fields(self): def _readable_fields(self):
@ -454,14 +459,16 @@ class Serializer(BaseSerializer):
ret = OrderedDict() ret = OrderedDict()
errors = OrderedDict() errors = OrderedDict()
fields = self._writable_fields fields = self._writable_fields
for field in fields: for field in fields:
validate_method = getattr(self, 'validate_' + field.field_name, None) validate_method = getattr(self, 'validate_' + field.field_name, None)
primitive_value = field.get_value(data) primitive_value = field.get_value(data)
validated_list = []
for inner_data in primitive_value:
try: try:
validated_value = field.run_validation(primitive_value) validated_value = field.run_validation(inner_data)
validated_list.append(validated_value)
if validate_method is not None: if validate_method is not None:
validated_value = validate_method(validated_value) validated_list.append(validate_method(validated_value))
except ValidationError as exc: except ValidationError as exc:
errors[field.field_name] = exc.detail errors[field.field_name] = exc.detail
except DjangoValidationError as exc: except DjangoValidationError as exc:
@ -469,11 +476,12 @@ class Serializer(BaseSerializer):
except SkipField: except SkipField:
pass pass
else: else:
set_value(ret, field.source_attrs, validated_value) if len(validated_list) > 1:
set_value(ret, field.source_attrs, validated_list)
else:
set_value(ret, field.source_attrs, validated_list[0])
if errors: if errors:
raise ValidationError(errors) raise ValidationError(errors)
return ret return ret
def to_representation(self, instance): def to_representation(self, instance):