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

index 84478f24cf8ca9b6fecabc146aff45c1c5acf64f..2b82fc20141100925a1f6c47417a73e7a89405e3 100644 (file)
@@ -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
@@ -207,6 +208,7 @@ def Field(
     *,
     default_factory: Optional[NoArgAnyCallable] = None,
     alias: Optional[str] = None,
+    alias_priority: Optional[int] = None,
     validation_alias: Optional[str] = None,
     serialization_alias: Optional[str] = None,
     title: Optional[str] = None,
@@ -250,6 +252,7 @@ def Field(
     *,
     default_factory: Optional[NoArgAnyCallable] = None,
     alias: Optional[str] = None,
+    alias_priority: Optional[int] = None,
     validation_alias: Optional[str] = None,
     serialization_alias: Optional[str] = None,
     title: Optional[str] = None,
@@ -302,6 +305,7 @@ def Field(
     *,
     default_factory: Optional[NoArgAnyCallable] = None,
     alias: Optional[str] = None,
+    alias_priority: Optional[int] = None,
     validation_alias: Optional[str] = None,
     serialization_alias: Optional[str] = None,
     title: Optional[str] = None,
@@ -335,6 +339,7 @@ def Field(
     *,
     default_factory: Optional[NoArgAnyCallable] = None,
     alias: Optional[str] = None,
+    alias_priority: Optional[int] = None,
     validation_alias: Optional[str] = None,
     serialization_alias: Optional[str] = None,
     title: Optional[str] = None,
@@ -371,11 +376,21 @@ def Field(
     schema_extra: Optional[dict[str, Any]] = None,
 ) -> Any:
     current_schema_extra = schema_extra or {}
+
+    for param_name in (
+        "alias_priority",
+    ):
+        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)
+
     # 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)
+    current_alias_priority = alias_priority or current_schema_extra.pop("alias_priority", None)
     field_info_kwargs = {
         "alias": alias,
+        "alias_priority": current_alias_priority,
         "title": title,
         "description": description,
         "exclude": exclude,
index 140b02fd9b1845d4c515df03828f50e41584a7d5..4906eb761242da98d7e677cfec62b44e4144e603 100644 (file)
@@ -2,7 +2,7 @@ from decimal import Decimal
 from typing import Literal, Optional, Union
 
 import pytest
-from pydantic import ValidationError
+from pydantic import ConfigDict, ValidationError
 from sqlmodel import Field, SQLModel
 
 
@@ -54,3 +54,57 @@ def test_repr():
 
     instance = Model(id=123, foo="bar")
     assert "foo=" not in repr(instance)
+
+
+def test_alias_priority_1():
+    def to_camel(string: str) -> str:
+        return "".join(word.capitalize() for word in string.split("_"))
+
+    class Model(SQLModel):
+        model_config = ConfigDict(alias_generator=to_camel)
+
+        field: str = Field(alias="field_alias", alias_priority=1)
+
+    m = Model.model_validate({"Field": "value1"})
+    assert m.field == "value1"
+
+    with pytest.raises(ValidationError):
+        Model.model_validate({"field_alias": "value1"})
+
+
+@pytest.mark.parametrize("alias_priority", [None, 2])
+def test_alias_priority_2(alias_priority: Optional[int]):
+    def to_camel(string: str) -> str:
+        return "".join(word.capitalize() for word in string.split("_"))
+
+    class Model(SQLModel):
+        model_config = ConfigDict(alias_generator=to_camel)
+
+        field: str = Field(alias="field_alias", alias_priority=alias_priority)
+
+    m = Model.model_validate({"field_alias": "value1"})
+    assert m.field == "value1"
+
+    with pytest.raises(ValidationError):
+        Model.model_validate({"Field": "value1"})
+
+
+def test_alias_priority_via_schema_extra():  # Current workaround. Remove after some time
+    def to_camel(string: str) -> str:
+        return "".join(word.capitalize() for word in string.split("_"))
+
+    with pytest.warns(
+        DeprecationWarning,
+        match="Pass `alias_priority` parameter directly to Field instead of passing it via `schema_extra`",
+    ):
+
+        class Model(SQLModel):
+            model_config = ConfigDict(alias_generator=to_camel)
+
+            field: str = Field(alias="field_alias", schema_extra={"alias_priority": 2})
+
+    m = Model.model_validate({"field_alias": "value1"})
+    assert m.field == "value1"
+
+    with pytest.raises(ValidationError):
+        Model.model_validate({"Field": "value1"})