)
from pydantic import BaseModel, EmailStr
+from pydantic.fields import Deprecated as Deprecated
from pydantic.fields import FieldInfo as PydanticFieldInfo
from sqlalchemy import (
Boolean,
title: Optional[str] = None,
description: Optional[str] = None,
examples: Optional[list[Any]] = None,
+ deprecated: Union[Deprecated, str, bool, None] = None,
exclude: Union[Set[Union[int, str]], Mapping[Union[int, str], Any], Any] = None,
include: Union[Set[Union[int, str]], Mapping[Union[int, str], Any], Any] = None,
const: Optional[bool] = None,
title: Optional[str] = None,
description: Optional[str] = None,
examples: Optional[list[Any]] = None,
+ deprecated: Union[Deprecated, str, bool, None] = None,
exclude: Union[Set[Union[int, str]], Mapping[Union[int, str], Any], Any] = None,
include: Union[Set[Union[int, str]], Mapping[Union[int, str], Any], Any] = None,
const: Optional[bool] = None,
title: Optional[str] = None,
description: Optional[str] = None,
examples: Optional[list[Any]] = None,
+ deprecated: Union[Deprecated, str, bool, None] = None,
exclude: Union[Set[Union[int, str]], Mapping[Union[int, str], Any], Any] = None,
include: Union[Set[Union[int, str]], Mapping[Union[int, str], Any], Any] = None,
const: Optional[bool] = None,
title: Optional[str] = None,
description: Optional[str] = None,
examples: Optional[list[Any]] = None,
+ deprecated: Union[Deprecated, str, bool, None] = None,
exclude: Union[Set[Union[int, str]], Mapping[Union[int, str], Any], Any] = None,
include: Union[Set[Union[int, str]], Mapping[Union[int, str], Any], Any] = None,
const: Optional[bool] = None,
) -> Any:
current_schema_extra = schema_extra or {}
- for param_name in ("strict", "examples"):
+ for param_name in ("strict", "examples", "deprecated"):
if param_name in current_schema_extra:
msg = f"Pass `{param_name}` parameter directly to Field instead of passing it via `schema_extra`"
warnings.warn(msg, DeprecationWarning, stacklevel=2)
schema_serialization_alias = current_schema_extra.pop("serialization_alias", None)
current_strict = strict or current_schema_extra.pop("strict", None)
current_examples = examples or current_schema_extra.pop("examples", None)
+ current_deprecated = deprecated or current_schema_extra.pop("deprecated", None)
field_info_kwargs = {
"alias": alias,
"title": title,
"description": description,
"examples": current_examples,
+ "deprecated": current_deprecated,
"exclude": exclude,
"include": include,
"const": const,
model_schema = Model.model_json_schema()
assert model_schema["properties"]["name"]["examples"] == ["Alice", "Bob"]
+
+
+def test_deprecated():
+ class Model(SQLModel):
+ old_field: str = Field(deprecated=True)
+ another_old_field: str = Field(deprecated="This field is deprecated")
+
+ model_schema = Model.model_json_schema()
+ assert model_schema["properties"]["old_field"]["deprecated"] is True
+ assert model_schema["properties"]["another_old_field"]["deprecated"] is True
+
+
+def test_deprecated_via_schema_extra(): # Current workaround. Remove after some time
+ with pytest.warns(
+ DeprecationWarning,
+ match="Pass `deprecated` parameter directly to Field instead of passing it via `schema_extra`",
+ ):
+
+ class Model(SQLModel):
+ old_field: str = Field(schema_extra={"deprecated": True})
+ another_old_field: str = Field(
+ schema_extra={"deprecated": "This field is deprecated"}
+ )
+
+ model_schema = Model.model_json_schema()
+ assert model_schema["properties"]["old_field"]["deprecated"] is True
+ assert model_schema["properties"]["another_old_field"]["deprecated"] is True