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
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
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
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
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