From 2863b52c922b0db7f9c2bc99a50119840e340d35 Mon Sep 17 00:00:00 2001 From: Yurii Motov Date: Wed, 28 Jan 2026 10:32:00 +0100 Subject: [PATCH 1/6] Update type annotation of `exclude` parameter to `Field` --- sqlmodel/main.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/sqlmodel/main.py b/sqlmodel/main.py index 84478f24cf..56fb5b0f36 100644 --- a/sqlmodel/main.py +++ b/sqlmodel/main.py @@ -211,7 +211,7 @@ def Field( serialization_alias: Optional[str] = None, title: Optional[str] = None, description: Optional[str] = None, - exclude: Union[Set[Union[int, str]], Mapping[Union[int, str], Any], Any] = None, + exclude: Union[bool, None] = None, include: Union[Set[Union[int, str]], Mapping[Union[int, str], Any], Any] = None, const: Optional[bool] = None, gt: Optional[float] = None, @@ -254,7 +254,7 @@ def Field( serialization_alias: Optional[str] = None, title: Optional[str] = None, description: Optional[str] = None, - exclude: Union[Set[Union[int, str]], Mapping[Union[int, str], Any], Any] = None, + exclude: Union[bool, None] = None, include: Union[Set[Union[int, str]], Mapping[Union[int, str], Any], Any] = None, const: Optional[bool] = None, gt: Optional[float] = None, @@ -306,7 +306,7 @@ def Field( serialization_alias: Optional[str] = None, title: Optional[str] = None, description: Optional[str] = None, - exclude: Union[Set[Union[int, str]], Mapping[Union[int, str], Any], Any] = None, + exclude: Union[bool, None] = None, include: Union[Set[Union[int, str]], Mapping[Union[int, str], Any], Any] = None, const: Optional[bool] = None, gt: Optional[float] = None, @@ -339,7 +339,7 @@ def Field( serialization_alias: Optional[str] = None, title: Optional[str] = None, description: Optional[str] = None, - exclude: Union[Set[Union[int, str]], Mapping[Union[int, str], Any], Any] = None, + exclude: Union[bool, None] = None, include: Union[Set[Union[int, str]], Mapping[Union[int, str], Any], Any] = None, const: Optional[bool] = None, gt: Optional[float] = None, From b2c1f53b9b128b7934cbcaf58731656d1979353d Mon Sep 17 00:00:00 2001 From: Yurii Motov Date: Wed, 28 Jan 2026 10:39:25 +0100 Subject: [PATCH 2/6] Add test for Field `exclude` parameter --- tests/test_pydantic/test_field.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/tests/test_pydantic/test_field.py b/tests/test_pydantic/test_field.py index 140b02fd9b..68858cf719 100644 --- a/tests/test_pydantic/test_field.py +++ b/tests/test_pydantic/test_field.py @@ -54,3 +54,16 @@ class Model(SQLModel): instance = Model(id=123, foo="bar") assert "foo=" not in repr(instance) + + +def test_exclude(): + class Model(SQLModel): + id: int + name: str + value: int = Field(exclude=True) + + instance = Model(id=1, name="test", value=42) + dict_representation = instance.model_dump() + assert "id" in dict_representation + assert "name" in dict_representation + assert "value" not in dict_representation From f46fc697a5ee4be9cce5cb948e0e3ebf866e321e Mon Sep 17 00:00:00 2001 From: Yurii Motov Date: Wed, 28 Jan 2026 10:44:49 +0100 Subject: [PATCH 3/6] Remove outdated `include` parameter from `Field` --- sqlmodel/main.py | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/sqlmodel/main.py b/sqlmodel/main.py index 56fb5b0f36..86672d7c55 100644 --- a/sqlmodel/main.py +++ b/sqlmodel/main.py @@ -4,7 +4,7 @@ import ipaddress import uuid import weakref -from collections.abc import Mapping, Sequence, Set +from collections.abc import Mapping, Sequence from datetime import date, datetime, time, timedelta from decimal import Decimal from enum import Enum @@ -212,7 +212,6 @@ def Field( title: Optional[str] = None, description: Optional[str] = None, exclude: Union[bool, None] = None, - include: Union[Set[Union[int, str]], Mapping[Union[int, str], Any], Any] = None, const: Optional[bool] = None, gt: Optional[float] = None, ge: Optional[float] = None, @@ -255,7 +254,6 @@ def Field( title: Optional[str] = None, description: Optional[str] = None, exclude: Union[bool, None] = None, - include: Union[Set[Union[int, str]], Mapping[Union[int, str], Any], Any] = None, const: Optional[bool] = None, gt: Optional[float] = None, ge: Optional[float] = None, @@ -307,7 +305,6 @@ def Field( title: Optional[str] = None, description: Optional[str] = None, exclude: Union[bool, None] = None, - include: Union[Set[Union[int, str]], Mapping[Union[int, str], Any], Any] = None, const: Optional[bool] = None, gt: Optional[float] = None, ge: Optional[float] = None, @@ -340,7 +337,6 @@ def Field( title: Optional[str] = None, description: Optional[str] = None, exclude: Union[bool, None] = None, - include: Union[Set[Union[int, str]], Mapping[Union[int, str], Any], Any] = None, const: Optional[bool] = None, gt: Optional[float] = None, ge: Optional[float] = None, @@ -379,7 +375,6 @@ def Field( "title": title, "description": description, "exclude": exclude, - "include": include, "const": const, "gt": gt, "ge": ge, From 8467dffd9bc46eb142fe09a21c68c8237815ab0b Mon Sep 17 00:00:00 2001 From: Yurii Motov Date: Tue, 3 Feb 2026 10:11:52 +0100 Subject: [PATCH 4/6] Revert "Remove outdated `include` parameter from `Field`" This reverts commit f46fc697a5ee4be9cce5cb948e0e3ebf866e321e. --- sqlmodel/main.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/sqlmodel/main.py b/sqlmodel/main.py index 86672d7c55..56fb5b0f36 100644 --- a/sqlmodel/main.py +++ b/sqlmodel/main.py @@ -4,7 +4,7 @@ import ipaddress import uuid import weakref -from collections.abc import Mapping, Sequence +from collections.abc import Mapping, Sequence, Set from datetime import date, datetime, time, timedelta from decimal import Decimal from enum import Enum @@ -212,6 +212,7 @@ def Field( title: Optional[str] = None, description: Optional[str] = None, exclude: Union[bool, None] = None, + include: Union[Set[Union[int, str]], Mapping[Union[int, str], Any], Any] = None, const: Optional[bool] = None, gt: Optional[float] = None, ge: Optional[float] = None, @@ -254,6 +255,7 @@ def Field( title: Optional[str] = None, description: Optional[str] = None, exclude: Union[bool, None] = None, + include: Union[Set[Union[int, str]], Mapping[Union[int, str], Any], Any] = None, const: Optional[bool] = None, gt: Optional[float] = None, ge: Optional[float] = None, @@ -305,6 +307,7 @@ def Field( title: Optional[str] = None, description: Optional[str] = None, exclude: Union[bool, None] = None, + include: Union[Set[Union[int, str]], Mapping[Union[int, str], Any], Any] = None, const: Optional[bool] = None, gt: Optional[float] = None, ge: Optional[float] = None, @@ -337,6 +340,7 @@ def Field( title: Optional[str] = None, description: Optional[str] = None, exclude: Union[bool, None] = None, + include: Union[Set[Union[int, str]], Mapping[Union[int, str], Any], Any] = None, const: Optional[bool] = None, gt: Optional[float] = None, ge: Optional[float] = None, @@ -375,6 +379,7 @@ def Field( "title": title, "description": description, "exclude": exclude, + "include": include, "const": const, "gt": gt, "ge": ge, From b1f6ff11f68a3da9ab15d4266700c121721cbd56 Mon Sep 17 00:00:00 2001 From: Yurii Motov Date: Tue, 3 Feb 2026 10:17:12 +0100 Subject: [PATCH 5/6] Deprecate `include`parameter of `Field` --- sqlmodel/main.py | 28 ++++++++++++++++++++++++---- tests/test_pydantic/test_field.py | 10 ++++++++++ 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/sqlmodel/main.py b/sqlmodel/main.py index 56fb5b0f36..1fec1ac129 100644 --- a/sqlmodel/main.py +++ b/sqlmodel/main.py @@ -3,6 +3,7 @@ import builtins import ipaddress import uuid +import warnings import weakref from collections.abc import Mapping, Sequence, Set from datetime import date, datetime, time, timedelta @@ -11,6 +12,7 @@ from pathlib import Path from typing import ( TYPE_CHECKING, + Annotated, Any, Callable, ClassVar, @@ -89,6 +91,8 @@ ] OnDeleteType = Literal["CASCADE", "SET NULL", "RESTRICT"] +INCLUDE_DEPRECATION_MSG = "`include` is deprecated and does nothing. It will be removed, use `exclude` instead" + def __dataclass_transform__( *, @@ -212,7 +216,10 @@ def Field( title: Optional[str] = None, description: Optional[str] = None, exclude: Union[bool, None] = None, - include: Union[Set[Union[int, str]], Mapping[Union[int, str], Any], Any] = None, + include: Annotated[ + Union[Set[Union[int, str]], Mapping[Union[int, str], Any], Any], + deprecated(INCLUDE_DEPRECATION_MSG), + ] = None, const: Optional[bool] = None, gt: Optional[float] = None, ge: Optional[float] = None, @@ -255,7 +262,10 @@ def Field( title: Optional[str] = None, description: Optional[str] = None, exclude: Union[bool, None] = None, - include: Union[Set[Union[int, str]], Mapping[Union[int, str], Any], Any] = None, + include: Annotated[ + Union[Set[Union[int, str]], Mapping[Union[int, str], Any], Any], + deprecated(INCLUDE_DEPRECATION_MSG), + ] = None, const: Optional[bool] = None, gt: Optional[float] = None, ge: Optional[float] = None, @@ -307,7 +317,10 @@ def Field( title: Optional[str] = None, description: Optional[str] = None, exclude: Union[bool, None] = None, - include: Union[Set[Union[int, str]], Mapping[Union[int, str], Any], Any] = None, + include: Annotated[ + Union[Set[Union[int, str]], Mapping[Union[int, str], Any], Any], + deprecated(INCLUDE_DEPRECATION_MSG), + ] = None, const: Optional[bool] = None, gt: Optional[float] = None, ge: Optional[float] = None, @@ -340,7 +353,10 @@ def Field( title: Optional[str] = None, description: Optional[str] = None, exclude: Union[bool, None] = None, - include: Union[Set[Union[int, str]], Mapping[Union[int, str], Any], Any] = None, + include: Annotated[ + Union[Set[Union[int, str]], Mapping[Union[int, str], Any], Any], + deprecated(INCLUDE_DEPRECATION_MSG), + ] = None, const: Optional[bool] = None, gt: Optional[float] = None, ge: Optional[float] = None, @@ -371,6 +387,10 @@ def Field( schema_extra: Optional[dict[str, Any]] = None, ) -> Any: current_schema_extra = schema_extra or {} + + if include is not None: + warnings.warn(INCLUDE_DEPRECATION_MSG, DeprecationWarning, stacklevel=2) + # Extract possible alias settings from schema_extra so we can control precedence schema_validation_alias = current_schema_extra.pop("validation_alias", None) schema_serialization_alias = current_schema_extra.pop("serialization_alias", None) diff --git a/tests/test_pydantic/test_field.py b/tests/test_pydantic/test_field.py index 68858cf719..ac5d57379b 100644 --- a/tests/test_pydantic/test_field.py +++ b/tests/test_pydantic/test_field.py @@ -67,3 +67,13 @@ class Model(SQLModel): assert "id" in dict_representation assert "name" in dict_representation assert "value" not in dict_representation + + +def test_include_is_deprecated(): + with pytest.warns( + DeprecationWarning, + match="`include` is deprecated and does nothing. It will be removed, use `exclude` instead", + ): + + class Model(SQLModel): + values: list[int] = Field(include=True) \ No newline at end of file From bd8e3b87fb051205af731566a41149341d1f1ded Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 3 Feb 2026 09:17:40 +0000 Subject: [PATCH 6/6] =?UTF-8?q?=F0=9F=8E=A8=20Auto=20format?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/test_pydantic/test_field.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_pydantic/test_field.py b/tests/test_pydantic/test_field.py index ac5d57379b..14dceb190b 100644 --- a/tests/test_pydantic/test_field.py +++ b/tests/test_pydantic/test_field.py @@ -76,4 +76,4 @@ def test_include_is_deprecated(): ): class Model(SQLModel): - values: list[int] = Field(include=True) \ No newline at end of file + values: list[int] = Field(include=True)