diff --git a/sqlmodel/main.py b/sqlmodel/main.py index d95c498507..e527aa60ce 100644 --- a/sqlmodel/main.py +++ b/sqlmodel/main.py @@ -514,6 +514,7 @@ def __init__(__pydantic_self__, **data: Any) -> None: for key in non_pydantic_keys: if key in __pydantic_self__.__sqlmodel_relationships__: setattr(__pydantic_self__, key, data[key]) + __pydantic_self__._init_private_attributes() def __setattr__(self, name: str, value: Any) -> None: if name in {"_sa_instance_state"}: diff --git a/tests/test_private_attributes.py b/tests/test_private_attributes.py new file mode 100644 index 0000000000..47d3017a03 --- /dev/null +++ b/tests/test_private_attributes.py @@ -0,0 +1,18 @@ +from typing import Optional + +from pydantic import PrivateAttr +from sqlmodel import Field, SQLModel + + +def test_private_attribute(): + class Hero(SQLModel, table=True): + primary_key: Optional[int] = Field( + default=None, + primary_key=True, + ) + _private_attribute: str = PrivateAttr(default="my_private_attribute") + + hero = Hero() + assert hero._private_attribute == "my_private_attribute" + assert "primary_key" in hero.dict() + assert "_private_attribute" not in hero.dict()