Ejemplo n.º 1
0
    def to_internal_value(self, data):
        """
        Dict of native values <- Dict of primitive datatypes.
        """

        if not isinstance(data, dict):
            message = self.error_messages['invalid'].format(
                datatype=type(data).__name__)
            raise serializers.ValidationError(
                {api_settings.NON_FIELD_ERRORS_KEY: [message]})

        ret = serializers.OrderedDict()
        errors = serializers.OrderedDict()
        fields = self._writable_fields

        for field in fields:
            validate_method = getattr(self, 'validate_' + field.field_name,
                                      None)
            result = copy.copy(data)
            if hasattr(field, 'key') and field.key is not None:
                if isinstance(field, BindableListSerializer) or isinstance(
                        field, serializers.Field):

                    for step in field.key.split('.'):
                        result = result.get(step, {})

                    if not isinstance(result, dict):
                        result = {field.field_name: result}

                primitive_value = field.get_value(result)

            try:
                validated_value = field.run_validation(primitive_value)
                if validate_method is not None:
                    validated_value = validate_method(validated_value)
            except serializers.ValidationError as exc:
                errors[field.field_name] = exc.detail
            except serializers.DjangoValidationError as exc:
                errors[field.field_name] = list(exc.messages)
            except serializers.SkipField:
                pass
            else:
                serializers.set_value(ret, field.source_attrs, validated_value)

        if errors:
            raise serializers.ValidationError(errors)

        return ret
Ejemplo n.º 2
0
 def validate_sku_id(self, value):
     try:
         SKU.objects.get(id=value)
     except Exception as e:
         logger.error(e)
         raise serializers.set_value('商品不存在')
     return value
Ejemplo n.º 3
0
    def update_to_internal_value(self, data):
        """
        Dict of native values <- Dict of primitive datatypes.
        """
        if not isinstance(data, Mapping):
            message = self.error_messages['invalid'].format(
                datatype=type(data).__name__)
            raise ValidationError(
                {api_settings.NON_FIELD_ERRORS_KEY: [message]}, code='invalid')

        ret = OrderedDict()
        errors = OrderedDict()
        fields = [
            self.fields[field_name] for field_name in data
            if field_name in self.fields
            if not self.fields[field_name].read_only
        ]

        for field in fields:
            # fields that are computed methods don't need validation:
            if field.read_only:
                continue
            validate_method = getattr(self, 'validate_' + field.field_name,
                                      None)
            try:
                validated_value = field.run_validation(data[field.field_name])
                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 (KeyError, SkipField):
                pass

            else:
                set_value(ret, field.source_attrs, validated_value)

        if errors:
            raise ValidationError(errors)

        return ret
Ejemplo n.º 4
0
    def to_internal_value(self, data):
        """
        Overrided ModelSerializer.to_internal_value for handling children
        """
        if not isinstance(data, Mapping):
            message = self.error_messages['invalid'].format(
                datatype=type(data).__name__)
            raise serializers.ValidationError(
                {serializers.api_settings.NON_FIELD_ERRORS_KEY: [message]},
                code='invalid')

        ret = OrderedDict()
        children = []
        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 serializers.ValidationError as exc:
                errors[field.field_name] = exc.detail
            except serializers.DjangoValidationError as exc:
                errors[field.field_name] = serializers.get_error_detail(exc)
            except serializers.SkipField:
                pass
            else:
                serializers.set_value(ret, field.source_attrs, validated_value)

        if errors:
            raise serializers.ValidationError(errors)
        for child in data.get('children', []):
            res = self.to_internal_value(child)
            children.append(res)
            if children:
                serializers.set_value(ret, ['children'], children)
        return ret
Ejemplo n.º 5
0
    def to_internal_value(self, data):
        """
        Dict of native values <- Dict of primitive datatypes.
        """
        if not isinstance(data, dict):
            message = self.error_messages['invalid'].format(
                datatype=type(data).__name__)
            raise ValidationError(
                {api_settings.NON_FIELD_ERRORS_KEY: [message]})

        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[ERROR_KEY] = exc.detail
                break
            except DjangoValidationError as exc:
                errors[ERROR_KEY] = list(exc.messages)
                break
            except serializers.SkipField:
                pass
            else:
                serializers.set_value(ret, field.source_attrs, validated_value)

        if errors:
            raise ValidationError(errors)

        return ret