mirror of
https://github.com/encode/django-rest-framework.git
synced 2025-08-05 04:50:12 +03:00
Merge 8e332ad16f
into 6831472a62
This commit is contained in:
commit
3975edb290
|
@ -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.
|
||||||
|
|
|
@ -11,7 +11,7 @@ python primitives.
|
||||||
response content is handled by parsers and renderers.
|
response content is handled by parsers and renderers.
|
||||||
"""
|
"""
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
import re
|
||||||
import copy
|
import copy
|
||||||
import inspect
|
import inspect
|
||||||
import traceback
|
import traceback
|
||||||
|
@ -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,26 +459,29 @@ 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)
|
||||||
try:
|
validated_list = []
|
||||||
validated_value = field.run_validation(primitive_value)
|
for inner_data in primitive_value:
|
||||||
if validate_method is not None:
|
try:
|
||||||
validated_value = validate_method(validated_value)
|
validated_value = field.run_validation(inner_data)
|
||||||
except ValidationError as exc:
|
validated_list.append(validated_value)
|
||||||
errors[field.field_name] = exc.detail
|
if validate_method is not None:
|
||||||
except DjangoValidationError as exc:
|
validated_list.append(validate_method(validated_value))
|
||||||
errors[field.field_name] = get_error_detail(exc)
|
except ValidationError as exc:
|
||||||
except SkipField:
|
errors[field.field_name] = exc.detail
|
||||||
pass
|
except DjangoValidationError as exc:
|
||||||
|
errors[field.field_name] = get_error_detail(exc)
|
||||||
|
except SkipField:
|
||||||
|
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):
|
||||||
|
|
Loading…
Reference in New Issue
Block a user