From: Yurii Motov Date: Wed, 28 Jan 2026 13:00:04 +0000 (+0100) Subject: Add `examples` param to Field, add tests X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=12ed8dc02f01a04056af6fb2f267f9cb771dee70;p=thirdparty%2Ffastapi%2Fsqlmodel.git Add `examples` param to Field, add tests --- diff --git a/sqlmodel/main.py b/sqlmodel/main.py index f76ae026..d9fb652e 100644 --- a/sqlmodel/main.py +++ b/sqlmodel/main.py @@ -212,6 +212,7 @@ def Field( serialization_alias: Optional[str] = None, title: Optional[str] = None, description: Optional[str] = None, + examples: Optional[list[Any]] = 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, @@ -256,6 +257,7 @@ def Field( serialization_alias: Optional[str] = None, title: Optional[str] = None, description: Optional[str] = None, + examples: Optional[list[Any]] = 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, @@ -309,6 +311,7 @@ def Field( serialization_alias: Optional[str] = None, title: Optional[str] = None, description: Optional[str] = None, + examples: Optional[list[Any]] = 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, @@ -343,6 +346,7 @@ def Field( serialization_alias: Optional[str] = None, title: Optional[str] = None, description: Optional[str] = None, + examples: Optional[list[Any]] = 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, @@ -377,7 +381,7 @@ def Field( ) -> Any: current_schema_extra = schema_extra or {} - for param_name in ("strict",): + for param_name in ("strict", "examples"): 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) @@ -386,10 +390,12 @@ def Field( schema_validation_alias = current_schema_extra.pop("validation_alias", None) 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) field_info_kwargs = { "alias": alias, "title": title, "description": description, + "examples": current_examples, "exclude": exclude, "include": include, "const": const, diff --git a/tests/test_pydantic/test_field.py b/tests/test_pydantic/test_field.py index c196061c..84758aed 100644 --- a/tests/test_pydantic/test_field.py +++ b/tests/test_pydantic/test_field.py @@ -127,3 +127,24 @@ def test_strict_via_schema_extra(): # Current workaround. Remove after some tim with pytest.raises(ValidationError): Model(val=123, val_strict="456") + + +def test_examples(): + class Model(SQLModel): + name: str = Field(examples=["Alice", "Bob"]) + + model_schema = Model.model_json_schema() + assert model_schema["properties"]["name"]["examples"] == ["Alice", "Bob"] + + +def test_examples_via_schema_extra(): # Current workaround. Remove after some time + with pytest.warns( + DeprecationWarning, + match="Pass `examples` parameter directly to Field instead of passing it via `schema_extra`", + ): + + class Model(SQLModel): + name: str = Field(schema_extra={"examples": ["Alice", "Bob"]}) + + model_schema = Model.model_json_schema() + assert model_schema["properties"]["name"]["examples"] == ["Alice", "Bob"]