diff --git a/sqlmodel/_compat.py b/sqlmodel/_compat.py index 4e80cdc374..18a7e3085f 100644 --- a/sqlmodel/_compat.py +++ b/sqlmodel/_compat.py @@ -72,6 +72,8 @@ def partial_init() -> Generator[None, None, None]: if IS_PYDANTIC_V2: + import inspect + from annotated_types import MaxLen from pydantic import ConfigDict as BaseConfig from pydantic._internal._fields import PydanticMetadata @@ -80,6 +82,10 @@ def partial_init() -> Generator[None, None, None]: from pydantic_core import PydanticUndefined as Undefined from pydantic_core import PydanticUndefinedType as UndefinedType + PYDANCTIC_FIELD_GET_DEFAULT_REQUIRES_VALIDATED_DATA = ( + "validated_data" in inspect.signature(FieldInfo.get_default).parameters + ) + # Dummy for types, to make it importable class ModelField: pass @@ -252,7 +258,13 @@ def sqlmodel_table_construct( elif name in values: fields_values[name] = values.pop(name) elif not field.is_required(): - defaults[name] = field.get_default(call_default_factory=True) + defaults[name] = ( + field.get_default( + call_default_factory=True, validated_data=fields_values + ) + if PYDANCTIC_FIELD_GET_DEFAULT_REQUIRES_VALIDATED_DATA + else field.get_default(call_default_factory=True) + ) if _fields_set is None: _fields_set = set(fields_values.keys()) fields_values.update(defaults)