]> git.ipfire.org Git - thirdparty/fastapi/sqlmodel.git/commitdiff
Add `examples` param to Field, add tests
authorYurii Motov <yurii.motov.monte@gmail.com>
Wed, 28 Jan 2026 13:00:04 +0000 (14:00 +0100)
committerYurii Motov <yurii.motov.monte@gmail.com>
Wed, 28 Jan 2026 17:01:56 +0000 (18:01 +0100)
sqlmodel/main.py
tests/test_pydantic/test_field.py

index f76ae0263699fc346a1ea40cafd90204d5443ed0..d9fb652e59ee7727c3caea84f800111cd951e02a 100644 (file)
@@ -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,
index c196061c6e20a7f3040c857f6084d277a1a9166e..84758aed5223ee317f23af68b8c6ef955de50e6e 100644 (file)
@@ -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"]