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,
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,
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,
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,
) -> 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)
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,
"exclude": exclude,
"exclude_if": current_exclude_if,
"include": include,
+ "field_title_generator": current_field_title_generator,
"const": const,
"gt": gt,
"ge": ge,
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"