]> git.ipfire.org Git - thirdparty/fastapi/sqlmodel.git/commitdiff
Merge remote-tracking branch 'upstream/main' into add-missing-parameters-to-field-2
authorYurii Motov <yurii.motov.monte@gmail.com>
Fri, 20 Feb 2026 22:23:24 +0000 (23:23 +0100)
committerYurii Motov <yurii.motov.monte@gmail.com>
Fri, 20 Feb 2026 22:23:24 +0000 (23:23 +0100)
1  2 
sqlmodel/main.py
tests/test_pydantic/test_field.py

index 07c836fb323b9f23c85fd740a247579e664cf64f,300031de8bd2783f5eeb7b33a2d5b77e755fc06e..2cd36a3cdf10d933541f0e51c20b78c4e60b3800
@@@ -3,9 -3,9 +3,10 @@@ from __future__ import annotation
  import builtins
  import ipaddress
  import uuid
 +import warnings
  import weakref
- from collections.abc import Mapping, Sequence, Set
+ from collections.abc import Callable, Mapping, Sequence, Set
+ from dataclasses import dataclass
  from datetime import date, datetime, time, timedelta
  from decimal import Decimal
  from enum import Enum
@@@ -206,44 -238,40 +239,44 @@@ def _get_sqlmodel_field_value
  def Field(
      default: Any = Undefined,
      *,
-     default_factory: Optional[NoArgAnyCallable] = None,
-     alias: Optional[str] = None,
-     validation_alias: Optional[str] = None,
-     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,
-     include: Union[Set[Union[int, str]], Mapping[Union[int, str], Any], Any] = None,
-     const: Optional[bool] = None,
-     coerce_numbers_to_str: Optional[bool] = None,
-     gt: Optional[float] = None,
-     ge: Optional[float] = None,
-     lt: Optional[float] = None,
-     le: Optional[float] = None,
-     multiple_of: Optional[float] = None,
-     max_digits: Optional[int] = None,
-     decimal_places: Optional[int] = None,
-     min_items: Optional[int] = None,
-     max_items: Optional[int] = None,
-     unique_items: Optional[bool] = None,
-     min_length: Optional[int] = None,
-     max_length: Optional[int] = None,
-     union_mode: Optional[Literal["smart", "left_to_right"]] = None,
-     fail_fast: Optional[bool] = None,
+     default_factory: NoArgAnyCallable | None = None,
+     alias: str | None = None,
+     validation_alias: str | None = None,
+     serialization_alias: str | None = None,
+     title: str | None = None,
+     description: str | None = None,
+     exclude: Set[int | str] | Mapping[int | str, Any] | Any = None,
+     include: Set[int | str] | Mapping[int | str, Any] | Any = None,
+     const: bool | None = None,
++    coerce_numbers_to_str: bool | None = None,
+     gt: float | None = None,
+     ge: float | None = None,
+     lt: float | None = None,
+     le: float | None = None,
+     multiple_of: float | None = None,
+     max_digits: int | None = None,
+     decimal_places: int | None = None,
+     min_items: int | None = None,
+     max_items: int | None = None,
+     unique_items: bool | None = None,
+     min_length: int | None = None,
+     max_length: int | None = None,
++    union_mode: Literal["smart", "left_to_right"] | None = None,
++    fail_fast: bool | None = None,
      allow_mutation: bool = True,
-     regex: Optional[str] = None,
-     discriminator: Optional[str] = None,
-     validate_default: Optional[bool] = None,
+     regex: str | None = None,
+     discriminator: str | None = None,
++    validate_default: bool | None = None,
      repr: bool = True,
-     primary_key: Union[bool, UndefinedType] = Undefined,
+     primary_key: bool | UndefinedType = Undefined,
      foreign_key: Any = Undefined,
-     unique: Union[bool, UndefinedType] = Undefined,
-     nullable: Union[bool, UndefinedType] = Undefined,
-     index: Union[bool, UndefinedType] = Undefined,
-     sa_type: Union[type[Any], UndefinedType] = Undefined,
-     sa_column_args: Union[Sequence[Any], UndefinedType] = Undefined,
-     sa_column_kwargs: Union[Mapping[str, Any], UndefinedType] = Undefined,
-     schema_extra: Optional[dict[str, Any]] = None,
+     unique: bool | UndefinedType = Undefined,
+     nullable: bool | UndefinedType = Undefined,
+     index: bool | UndefinedType = Undefined,
+     sa_type: type[Any] | UndefinedType = Undefined,
+     sa_column_args: Sequence[Any] | UndefinedType = Undefined,
+     sa_column_kwargs: Mapping[str, Any] | UndefinedType = Undefined,
+     schema_extra: dict[str, Any] | None = None,
  ) -> Any: ...
  
  
  def Field(
      default: Any = Undefined,
      *,
-     default_factory: Optional[NoArgAnyCallable] = None,
-     alias: Optional[str] = None,
-     validation_alias: Optional[str] = None,
-     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,
-     include: Union[Set[Union[int, str]], Mapping[Union[int, str], Any], Any] = None,
-     const: Optional[bool] = None,
-     coerce_numbers_to_str: Optional[bool] = None,
-     gt: Optional[float] = None,
-     ge: Optional[float] = None,
-     lt: Optional[float] = None,
-     le: Optional[float] = None,
-     multiple_of: Optional[float] = None,
-     max_digits: Optional[int] = None,
-     decimal_places: Optional[int] = None,
-     min_items: Optional[int] = None,
-     max_items: Optional[int] = None,
-     unique_items: Optional[bool] = None,
-     min_length: Optional[int] = None,
-     max_length: Optional[int] = None,
-     union_mode: Optional[Literal["smart", "left_to_right"]] = None,
-     fail_fast: Optional[bool] = None,
+     default_factory: NoArgAnyCallable | None = None,
+     alias: str | None = None,
+     validation_alias: str | None = None,
+     serialization_alias: str | None = None,
+     title: str | None = None,
+     description: str | None = None,
+     exclude: Set[int | str] | Mapping[int | str, Any] | Any = None,
+     include: Set[int | str] | Mapping[int | str, Any] | Any = None,
+     const: bool | None = None,
++    coerce_numbers_to_str: bool | None = None,
+     gt: float | None = None,
+     ge: float | None = None,
+     lt: float | None = None,
+     le: float | None = None,
+     multiple_of: float | None = None,
+     max_digits: int | None = None,
+     decimal_places: int | None = None,
+     min_items: int | None = None,
+     max_items: int | None = None,
+     unique_items: bool | None = None,
+     min_length: int | None = None,
+     max_length: int | None = None,
++    union_mode: Literal["smart", "left_to_right"] | None = None,
++    fail_fast: bool | None = None,
      allow_mutation: bool = True,
-     regex: Optional[str] = None,
-     discriminator: Optional[str] = None,
-     validate_default: Optional[bool] = None,
+     regex: str | None = None,
+     discriminator: str | None = None,
++    validate_default: bool | None = None,
      repr: bool = True,
-     primary_key: Union[bool, UndefinedType] = Undefined,
+     primary_key: bool | UndefinedType = Undefined,
      foreign_key: str,
-     ondelete: Union[OnDeleteType, UndefinedType] = Undefined,
-     unique: Union[bool, UndefinedType] = Undefined,
-     nullable: Union[bool, UndefinedType] = Undefined,
-     index: Union[bool, UndefinedType] = Undefined,
-     sa_type: Union[type[Any], UndefinedType] = Undefined,
-     sa_column_args: Union[Sequence[Any], UndefinedType] = Undefined,
-     sa_column_kwargs: Union[Mapping[str, Any], UndefinedType] = Undefined,
-     schema_extra: Optional[dict[str, Any]] = None,
+     ondelete: OnDeleteType | UndefinedType = Undefined,
+     unique: bool | UndefinedType = Undefined,
+     nullable: bool | UndefinedType = Undefined,
+     index: bool | UndefinedType = Undefined,
+     sa_type: type[Any] | UndefinedType = Undefined,
+     sa_column_args: Sequence[Any] | UndefinedType = Undefined,
+     sa_column_kwargs: Mapping[str, Any] | UndefinedType = Undefined,
+     schema_extra: dict[str, Any] | None = None,
  ) -> Any: ...
  
  
  def Field(
      default: Any = Undefined,
      *,
-     default_factory: Optional[NoArgAnyCallable] = None,
-     alias: Optional[str] = None,
-     validation_alias: Optional[str] = None,
-     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,
-     include: Union[Set[Union[int, str]], Mapping[Union[int, str], Any], Any] = None,
-     const: Optional[bool] = None,
-     coerce_numbers_to_str: Optional[bool] = None,
-     gt: Optional[float] = None,
-     ge: Optional[float] = None,
-     lt: Optional[float] = None,
-     le: Optional[float] = None,
-     multiple_of: Optional[float] = None,
-     max_digits: Optional[int] = None,
-     decimal_places: Optional[int] = None,
-     min_items: Optional[int] = None,
-     max_items: Optional[int] = None,
-     unique_items: Optional[bool] = None,
-     min_length: Optional[int] = None,
-     max_length: Optional[int] = None,
-     union_mode: Optional[Literal["smart", "left_to_right"]] = None,
-     fail_fast: Optional[bool] = None,
+     default_factory: NoArgAnyCallable | None = None,
+     alias: str | None = None,
+     validation_alias: str | None = None,
+     serialization_alias: str | None = None,
+     title: str | None = None,
+     description: str | None = None,
+     exclude: Set[int | str] | Mapping[int | str, Any] | Any = None,
+     include: Set[int | str] | Mapping[int | str, Any] | Any = None,
+     const: bool | None = None,
++    coerce_numbers_to_str: bool | None= None,
+     gt: float | None = None,
+     ge: float | None = None,
+     lt: float | None = None,
+     le: float | None = None,
+     multiple_of: float | None = None,
+     max_digits: int | None = None,
+     decimal_places: int | None = None,
+     min_items: int | None = None,
+     max_items: int | None = None,
+     unique_items: bool | None = None,
+     min_length: int | None = None,
+     max_length: int | None = None,
++    union_mode: Literal["smart", "left_to_right"] | None = None,
++    fail_fast: bool | None = None,
      allow_mutation: bool = True,
-     regex: Optional[str] = None,
-     discriminator: Optional[str] = None,
-     validate_default: Optional[bool] = None,
+     regex: str | None = None,
+     discriminator: str | None = None,
++    validate_default: bool | None = None,
      repr: bool = True,
-     sa_column: Union[Column[Any], UndefinedType] = Undefined,
-     schema_extra: Optional[dict[str, Any]] = None,
+     sa_column: Column[Any] | UndefinedType = Undefined,
+     schema_extra: dict[str, Any] | None = None,
  ) -> Any: ...
  
  
  def Field(
      default: Any = Undefined,
      *,
-     default_factory: Optional[NoArgAnyCallable] = None,
-     alias: Optional[str] = None,
-     validation_alias: Optional[str] = None,
-     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,
-     include: Union[Set[Union[int, str]], Mapping[Union[int, str], Any], Any] = None,
-     const: Optional[bool] = None,
-     coerce_numbers_to_str: Optional[bool] = None,
-     gt: Optional[float] = None,
-     ge: Optional[float] = None,
-     lt: Optional[float] = None,
-     le: Optional[float] = None,
-     multiple_of: Optional[float] = None,
-     max_digits: Optional[int] = None,
-     decimal_places: Optional[int] = None,
-     min_items: Optional[int] = None,
-     max_items: Optional[int] = None,
-     unique_items: Optional[bool] = None,
-     min_length: Optional[int] = None,
-     max_length: Optional[int] = None,
-     union_mode: Optional[Literal["smart", "left_to_right"]] = None,
-     fail_fast: Optional[bool] = None,
+     default_factory: NoArgAnyCallable | None = None,
+     alias: str | None = None,
+     validation_alias: str | None = None,
+     serialization_alias: str | None = None,
+     title: str | None = None,
+     description: str | None = None,
+     exclude: Set[int | str] | Mapping[int | str, Any] | Any = None,
+     include: Set[int | str] | Mapping[int | str, Any] | Any = None,
+     const: bool | None = None,
++    coerce_numbers_to_str: bool | None = None,
+     gt: float | None = None,
+     ge: float | None = None,
+     lt: float | None = None,
+     le: float | None = None,
+     multiple_of: float | None = None,
+     max_digits: int | None = None,
+     decimal_places: int | None = None,
+     min_items: int | None = None,
+     max_items: int | None = None,
+     unique_items: bool | None = None,
+     min_length: int | None = None,
+     max_length: int | None = None,
++    union_mode: Literal["smart", "left_to_right"] | None = None,
++    fail_fast: bool | None = None,
      allow_mutation: bool = True,
-     regex: Optional[str] = None,
-     discriminator: Optional[str] = None,
-     validate_default: Optional[bool] = None,
+     regex: str | None = None,
+     discriminator: str | None = None,
++    validate_default: bool | None = None,
      repr: bool = True,
-     primary_key: Union[bool, UndefinedType] = Undefined,
+     primary_key: bool | UndefinedType = Undefined,
      foreign_key: Any = Undefined,
-     ondelete: Union[OnDeleteType, UndefinedType] = Undefined,
-     unique: Union[bool, UndefinedType] = Undefined,
-     nullable: Union[bool, UndefinedType] = Undefined,
-     index: Union[bool, UndefinedType] = Undefined,
-     sa_type: Union[type[Any], UndefinedType] = Undefined,
-     sa_column: Union[Column, UndefinedType] = Undefined,  # type: ignore
-     sa_column_args: Union[Sequence[Any], UndefinedType] = Undefined,
-     sa_column_kwargs: Union[Mapping[str, Any], UndefinedType] = Undefined,
-     schema_extra: Optional[dict[str, Any]] = None,
+     ondelete: OnDeleteType | UndefinedType = Undefined,
+     unique: bool | UndefinedType = Undefined,
+     nullable: bool | UndefinedType = Undefined,
+     index: bool | UndefinedType = Undefined,
+     sa_type: type[Any] | UndefinedType = Undefined,
+     sa_column: Column | UndefinedType = Undefined,  # type: ignore
+     sa_column_args: Sequence[Any] | UndefinedType = Undefined,
+     sa_column_kwargs: Mapping[str, Any] | UndefinedType = Undefined,
+     schema_extra: dict[str, Any] | None = None,
  ) -> Any:
      current_schema_extra = schema_extra or {}
 +
 +    for param_name in (
 +        "coerce_numbers_to_str",
 +        "validate_default",
 +        "union_mode",
 +        "fail_fast",
 +    ):
 +        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, UserWarning, 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)
Simple merge