Add deprecated param to Field, add tests

This commit is contained in:
Yurii Motov
2026-01-28 14:11:19 +01:00
parent 12ed8dc02f
commit 159838fc89
2 changed files with 35 additions and 1 deletions

View File

@@ -24,6 +24,7 @@ from typing import (
)
from pydantic import BaseModel, EmailStr
from pydantic.fields import Deprecated as Deprecated
from pydantic.fields import FieldInfo as PydanticFieldInfo
from sqlalchemy import (
Boolean,
@@ -213,6 +214,7 @@ def Field(
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,
@@ -258,6 +260,7 @@ def Field(
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,
@@ -312,6 +315,7 @@ def Field(
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,
@@ -347,6 +351,7 @@ def Field(
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,
@@ -381,7 +386,7 @@ def Field(
) -> 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)
@@ -391,11 +396,13 @@ def Field(
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,

View File

@@ -148,3 +148,30 @@ def test_examples_via_schema_extra(): # Current workaround. Remove after some t
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