import builtins
import ipaddress
import uuid
+import warnings
import weakref
from collections.abc import Mapping, Sequence, Set
from datetime import date, datetime, time, timedelta
*,
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,
*,
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,
*,
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,
*,
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,
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,
from typing import Literal, Optional, Union
import pytest
-from pydantic import ValidationError
+from pydantic import ConfigDict, ValidationError
from sqlmodel import Field, SQLModel
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"})