From 8f10485266424f8b1501bb6ed6226848f99dffd9 Mon Sep 17 00:00:00 2001 From: Martin Thorsen Ranang Date: Fri, 15 Nov 2024 10:35:11 +0100 Subject: [PATCH 1/2] Support upcoming changes in Pydantic version 2.10. Without this fix, any SQLModel-based model with `table=True` and a `Field` that sets `default_factory=...` will brake with the following error message: `ValueError: 'validated_data' must be provided if 'call_default_factory' is True.` --- sqlmodel/_compat.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sqlmodel/_compat.py b/sqlmodel/_compat.py index 4e80cdc374..29149ea301 100644 --- a/sqlmodel/_compat.py +++ b/sqlmodel/_compat.py @@ -252,7 +252,8 @@ 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 _fields_set is None: _fields_set = set(fields_values.keys()) fields_values.update(defaults) From b49104adb372bf166ddf356c35bb357bdc1e8c7f Mon Sep 17 00:00:00 2001 From: Martin Thorsen Ranang Date: Fri, 15 Nov 2024 11:54:38 +0100 Subject: [PATCH 2/2] Support upcoming changes in Pydantic version 2.10. Without this fix, any SQLModels with a `Field` that uses `default_factory=...` will brake with the following error message: `ValueError: 'validated_data' must be provided if 'call_default_factory' is True`. Made the fix backwards compatible. --- sqlmodel/_compat.py | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/sqlmodel/_compat.py b/sqlmodel/_compat.py index 29149ea301..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,8 +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, - validated_data=fields_values) + 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)