From c66df67c4946c52ccd70230299b49459dadd7e29 Mon Sep 17 00:00:00 2001 From: sol HYUN Date: Mon, 5 Dec 2016 19:16:01 +0900 Subject: [PATCH] Modify 'to_internal_value' method for handling list modified the 'get_value' method in fields.py, The value of primitive_value is a list of values to match the field. Validate the primitive_value (list) elements one by one using the run_validation method. The verified value is appended to the validated_list Finally, only when there are two or more elements of validated_list, they are returned as a list. --- rest_framework/serializers.py | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py index 8e7206fd8..cec87e881 100644 --- a/rest_framework/serializers.py +++ b/rest_framework/serializers.py @@ -454,26 +454,29 @@ class Serializer(BaseSerializer): ret = OrderedDict() errors = OrderedDict() fields = self._writable_fields - for field in fields: validate_method = getattr(self, 'validate_' + field.field_name, None) primitive_value = field.get_value(data) - try: - validated_value = field.run_validation(primitive_value) - if validate_method is not None: - validated_value = validate_method(validated_value) - except ValidationError as exc: - errors[field.field_name] = exc.detail - except DjangoValidationError as exc: - errors[field.field_name] = get_error_detail(exc) - except SkipField: - pass + validated_list = [] + for inner_data in primitive_value: + try: + validated_value = field.run_validation(inner_data) + validated_list.append(validated_value) + if validate_method is not None: + validated_list.append(validate_method(validated_value)) + except ValidationError as exc: + errors[field.field_name] = exc.detail + except DjangoValidationError as exc: + errors[field.field_name] = get_error_detail(exc) + except SkipField: + pass 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: raise ValidationError(errors) - return ret def to_representation(self, instance):