{"record":{"id":"e310016152c126dc","repo":"HumanSignal/label-studio","slug":"enter-a-valid-value-type-lower-value","errorCode":null,"errorMessage":"Enter a valid {value_type.lower()} value.","messagePattern":"Enter a valid (.+?) value\\.","errorType":"validation","errorClass":"ValidationError","httpStatus":400,"severity":"error","filePath":"label_studio/data_manager/actions/data_columns.py","lineNumber":54,"sourceCode":"\n    if not isinstance(value_name, str) or not value_name.strip():\n        raise ValidationError({'column_name': 'Select an existing column or enter a new column name.'})\n\n    value_name = value_name.strip()\n    column_exists = value_name in project.summary.all_data_columns\n    if not column_exists:\n        column_exists = project.tasks.filter(data__has_key=value_name).exists()\n    mode = 'update' if column_exists else 'add'\n    # Existing columns (e.g. imported spreadsheet headers) stay editable, but a new column must be\n    # one the Data Manager can filter and sort on.\n    if mode == 'add' and not is_queryable_column_name(value_name):\n        raise ValidationError(\n            {'column_name': f'Column name cannot contain {UNQUERYABLE_COLUMN_NAME_CHARACTERS}.'},\n        )\n    try:\n        value = {'String': str, 'Number': float, 'Expression': str}[value_type](value)\n    except (TypeError, ValueError) as exc:\n        raise ValidationError({'value': f'Enter a valid {value_type.lower()} value.'}) from exc\n\n    return mode, value_name, value_type, value\n\n\ndef _set_data_value_in_batches(queryset, value_name, postgres_value, sqlite_value):\n    if settings.DJANGO_DB == settings.DJANGO_DB_SQLITE:\n        updated_count = 0\n        task_iterator = iterate_queryset(queryset.only('id', 'data'), chunk_size=settings.UPDATE_COLUMN_BATCH_SIZE)\n        for task_batch in batched_iterator(task_iterator, settings.UPDATE_COLUMN_BATCH_SIZE):\n            for task in task_batch:\n                task.data = task.data or {}\n                task.data[value_name] = sqlite_value(task)\n            Task.objects.bulk_update(task_batch, fields=['data'], batch_size=settings.UPDATE_COLUMN_BATCH_SIZE)\n            updated_count += len(task_batch)\n        return updated_count\n\n    updated_count = 0\n    task_iterator = iterate_queryset(queryset.only('id', 'project_id'), chunk_size=settings.UPDATE_COLUMN_BATCH_SIZE)","sourceCodeStart":36,"sourceCodeEnd":72,"githubUrl":"https://github.com/HumanSignal/label-studio/blob/0b49e9b53917880baf1dd85d574fe5541a9aafb2/label_studio/data_manager/actions/data_columns.py#L36-L72","documentation":"After validation, the raw value is coerced with the callable mapped from value_type ({'String': str, 'Number': float, 'Expression': str}). If the conversion raises TypeError or ValueError, ValidationError {'value': 'Enter a valid <value_type> value.'} is raised. Most commonly a non-numeric string was supplied for value_type 'Number'.","triggerScenarios":"value_type 'Number' with value 'abc' or '' (float('abc') raises ValueError); value None for a Number column (float(None) raises TypeError).","commonSituations":"Spreadsheet cell containing text mapped to a Number column; locale-formatted numbers with commas ('1,5'); empty CSV cells submitted as empty strings.","solutions":["Provide a value convertible to float when value_type is 'Number' (e.g. '42' or '3.14').","Use value_type 'String' for non-numeric text.","Convert empty/None values to a suitable default before submitting."],"exampleFix":"// before\n{'value_type': 'Number', 'value': '12,5', 'column_name': 'score'}\n// after\n{'value_type': 'Number', 'value': '12.5', 'column_name': 'score'}","handlingStrategy":"validation","validationCode":"vt = request_data.get('value_type', 'String')\nraw = request_data.get('value', '')\nif vt == 'Number':\n    float(raw)  # raises before the API call if not numeric","typeGuard":"def is_coercible(value, value_type):\n    try:\n        {'String': str, 'Number': float, 'Expression': str}[value_type](value)\n        return True\n    except (TypeError, ValueError):\n        return False","tryCatchPattern":"from rest_framework.exceptions import ValidationError\ntry:\n    add_data_field(project, qs, request=request)\nexcept ValidationError as e:\n    if 'value' in e.message_dict:\n        show_value_type_hint(e.message_dict['value'])","preventionTips":["Coerce values client-side with the same rules (str/float/str).","Handle locale decimal separators before sending Numbers.","Convert empty spreadsheet cells to a default value or 'String' type."],"tags":["django","validation","data-manager","columns","type-coercion"],"backgroundTag":"type-conversion-failed","analyzedSha":"0b49e9b53917880baf1dd85d574fe5541a9aafb2","analyzedAt":"2026-08-29T00:39:52.578Z","schemaVersion":2},"datasetVersion":"2026-08-29T02:17:18.158Z"}