From: Yurii Motov Date: Tue, 3 Feb 2026 09:17:12 +0000 (+0100) Subject: Deprecate `include`parameter of `Field` X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=b1f6ff11f68a3da9ab15d4266700c121721cbd56;p=thirdparty%2Ffastapi%2Fsqlmodel.git Deprecate `include`parameter of `Field` --- diff --git a/sqlmodel/main.py b/sqlmodel/main.py index 56fb5b0f3..1fec1ac12 100644 --- a/sqlmodel/main.py +++ b/sqlmodel/main.py @@ -3,6 +3,7 @@ from __future__ import annotations 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 enum import Enum from pathlib import Path from typing import ( TYPE_CHECKING, + Annotated, Any, Callable, ClassVar, @@ -89,6 +91,8 @@ IncEx: TypeAlias = Union[ ] 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 68858cf71..ac5d57379 100644 --- a/tests/test_pydantic/test_field.py +++ b/tests/test_pydantic/test_field.py @@ -67,3 +67,13 @@ def test_exclude(): 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