From: Yurii Motov Date: Wed, 28 Jan 2026 14:06:42 +0000 (+0100) Subject: Add `field_title_generator` param to Field, add tests X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=refs%2Fheads%2Fadd-missing-parameters-to-field;p=thirdparty%2Ffastapi%2Fsqlmodel.git Add `field_title_generator` param to Field, add tests --- diff --git a/sqlmodel/main.py b/sqlmodel/main.py index cae0f986..2628dd79 100644 --- a/sqlmodel/main.py +++ b/sqlmodel/main.py @@ -212,6 +212,7 @@ def Field( validation_alias: Optional[str] = None, serialization_alias: Optional[str] = None, title: Optional[str] = None, + field_title_generator: Optional[Callable[[str, PydanticFieldInfo], str]] = None, description: Optional[str] = None, examples: Optional[list[Any]] = None, deprecated: Union[Deprecated, str, bool, None] = None, @@ -259,6 +260,7 @@ def Field( validation_alias: Optional[str] = None, serialization_alias: Optional[str] = None, title: Optional[str] = None, + field_title_generator: Optional[Callable[[str, PydanticFieldInfo], str]] = None, description: Optional[str] = None, examples: Optional[list[Any]] = None, deprecated: Union[Deprecated, str, bool, None] = None, @@ -315,6 +317,7 @@ def Field( validation_alias: Optional[str] = None, serialization_alias: Optional[str] = None, title: Optional[str] = None, + field_title_generator: Optional[Callable[[str, PydanticFieldInfo], str]] = None, description: Optional[str] = None, examples: Optional[list[Any]] = None, deprecated: Union[Deprecated, str, bool, None] = None, @@ -352,6 +355,7 @@ def Field( validation_alias: Optional[str] = None, serialization_alias: Optional[str] = None, title: Optional[str] = None, + field_title_generator: Optional[Callable[[str, PydanticFieldInfo], str]] = None, description: Optional[str] = None, examples: Optional[list[Any]] = None, deprecated: Union[Deprecated, str, bool, None] = None, @@ -390,7 +394,13 @@ def Field( ) -> Any: current_schema_extra = schema_extra or {} - for param_name in ("strict", "examples", "deprecated", "exclude_if"): + for param_name in ( + "strict", + "examples", + "deprecated", + "exclude_if", + "field_title_generator", + ): 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) @@ -402,6 +412,9 @@ def Field( current_examples = examples or current_schema_extra.pop("examples", None) current_deprecated = deprecated or current_schema_extra.pop("deprecated", None) current_exclude_if = exclude_if or current_schema_extra.pop("exclude_if", None) + current_field_title_generator = field_title_generator or current_schema_extra.pop( + "field_title_generator", None + ) field_info_kwargs = { "alias": alias, "title": title, @@ -411,6 +424,7 @@ def Field( "exclude": exclude, "exclude_if": current_exclude_if, "include": include, + "field_title_generator": current_field_title_generator, "const": const, "gt": gt, "ge": ge, diff --git a/tests/test_pydantic/test_field.py b/tests/test_pydantic/test_field.py index d97640bf..ab938b14 100644 --- a/tests/test_pydantic/test_field.py +++ b/tests/test_pydantic/test_field.py @@ -220,3 +220,34 @@ def test_exclude_if_via_schema_extra(): assert dict1["name"] == "Alice" assert "name" not in dict2 + + +def test_field_title_generator(): + def upper(value: str, _: Any) -> str: + return value.upper() + + class Model(SQLModel): + name: str = Field(field_title_generator=upper) + age: int + + model_schema = Model.model_json_schema() + assert model_schema["properties"]["name"]["title"] == "NAME" + assert model_schema["properties"]["age"]["title"] == "Age" + + +def test_field_title_generator_via_schema_extra(): + def upper(value: str, _: Any) -> str: + return value.upper() + + with pytest.warns( + DeprecationWarning, + match="Pass `field_title_generator` parameter directly to Field instead of passing it via `schema_extra`", + ): + + class Model(SQLModel): + name: str = Field(schema_extra={"field_title_generator": upper}) + age: int + + model_schema = Model.model_json_schema() + assert model_schema["properties"]["name"]["title"] == "NAME" + assert model_schema["properties"]["age"]["title"] == "Age"