mirror of
https://github.com/fastapi/sqlmodel.git
synced 2026-03-13 09:29:54 +08:00
Add alias_priority param to Field, add tests
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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"})
|
||||
|
||||
Reference in New Issue
Block a user