diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 57dba1c286..b812f3da46 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -67,7 +67,7 @@ jobs: if: matrix.pydantic-version == 'pydantic-v2' run: uv pip install --upgrade "pydantic>=2.0.2,<3.0.0" - name: Lint - if: matrix.pydantic-version == 'pydantic-v2' + if: matrix.pydantic-version == 'pydantic-v2' && matrix.python-version != '3.8' run: bash scripts/lint.sh - run: mkdir coverage - name: Test diff --git a/sqlmodel/_compat.py b/sqlmodel/_compat.py index d6b98aaca7..38dd501c4a 100644 --- a/sqlmodel/_compat.py +++ b/sqlmodel/_compat.py @@ -103,7 +103,14 @@ def set_config_value( model.model_config[parameter] = value # type: ignore[literal-required] def get_model_fields(model: InstanceOrType[BaseModel]) -> Dict[str, "FieldInfo"]: - return model.model_fields + # TODO: refactor the usage of this function to always pass the class + # not the instance, and then remove this extra check + # this is for compatibility with Pydantic v3 + if isinstance(model, type): + use_model = model + else: + use_model = model.__class__ + return use_model.model_fields def get_fields_set( object: InstanceOrType["SQLModel"], diff --git a/sqlmodel/main.py b/sqlmodel/main.py index 45a41997fe..38c85915aa 100644 --- a/sqlmodel/main.py +++ b/sqlmodel/main.py @@ -477,7 +477,7 @@ def Relationship( class SQLModelMetaclass(ModelMetaclass, DeclarativeMeta): __sqlmodel_relationships__: Dict[str, RelationshipInfo] model_config: SQLModelConfig - model_fields: Dict[str, FieldInfo] # type: ignore[assignment] + model_fields: ClassVar[Dict[str, FieldInfo]] __config__: Type[SQLModelConfig] __fields__: Dict[str, ModelField] # type: ignore[assignment] @@ -839,7 +839,7 @@ def __tablename__(cls) -> str: return cls.__name__.lower() @classmethod - def model_validate( + def model_validate( # type: ignore[override] cls: Type[_TSQLModel], obj: Any, *, @@ -863,20 +863,25 @@ def model_dump( mode: Union[Literal["json", "python"], str] = "python", include: Union[IncEx, None] = None, exclude: Union[IncEx, None] = None, - context: Union[Dict[str, Any], None] = None, - by_alias: bool = False, + context: Union[Any, None] = None, + by_alias: Union[bool, None] = None, exclude_unset: bool = False, exclude_defaults: bool = False, exclude_none: bool = False, round_trip: bool = False, warnings: Union[bool, Literal["none", "warn", "error"]] = True, + fallback: Union[Callable[[Any], Any], None] = None, serialize_as_any: bool = False, ) -> Dict[str, Any]: + if PYDANTIC_MINOR_VERSION < (2, 11): + by_alias = by_alias or False if PYDANTIC_MINOR_VERSION >= (2, 7): extra_kwargs: Dict[str, Any] = { "context": context, "serialize_as_any": serialize_as_any, } + if PYDANTIC_MINOR_VERSION >= (2, 11): + extra_kwargs["fallback"] = fallback else: extra_kwargs = {} if IS_PYDANTIC_V2: @@ -896,7 +901,7 @@ def model_dump( return super().dict( include=include, exclude=exclude, - by_alias=by_alias, + by_alias=by_alias or False, exclude_unset=exclude_unset, exclude_defaults=exclude_defaults, exclude_none=exclude_none,