From cd5f9ace8a9172e014576f05102eec830a3b5b8a Mon Sep 17 00:00:00 2001 From: Michael Statt Date: Thu, 30 Sep 2021 12:01:52 -0400 Subject: [PATCH 1/3] Updated the order of setattr fields to preserve __fields_set__ attr --- sqlmodel/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sqlmodel/main.py b/sqlmodel/main.py index 661276b31d..c6eb8e4bd4 100644 --- a/sqlmodel/main.py +++ b/sqlmodel/main.py @@ -497,9 +497,9 @@ def __init__(__pydantic_self__, **data: Any) -> None: # Do not set values as in Pydantic, pass them through setattr, so SQLAlchemy # can handle them # object.__setattr__(__pydantic_self__, '__dict__', values) - object.__setattr__(__pydantic_self__, "__fields_set__", fields_set) for key, value in values.items(): setattr(__pydantic_self__, key, value) + object.__setattr__(__pydantic_self__, "__fields_set__", fields_set) non_pydantic_keys = data.keys() - values.keys() for key in non_pydantic_keys: if key in __pydantic_self__.__sqlmodel_relationships__: From c0e59c1c3ed87f59281ad82e187a1e0bf9db1f8f Mon Sep 17 00:00:00 2001 From: Michael Statt Date: Thu, 30 Sep 2021 12:17:45 -0400 Subject: [PATCH 2/3] Added test for __fields_set__ attribute --- tests/test_fields_set.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 tests/test_fields_set.py diff --git a/tests/test_fields_set.py b/tests/test_fields_set.py new file mode 100644 index 0000000000..843953ccea --- /dev/null +++ b/tests/test_fields_set.py @@ -0,0 +1,20 @@ +from datetime import datetime, timedelta +from sqlmodel import SQLModel, Field + + +def test_fields_set(): + class User(SQLModel): + username: str + email: str = "test@test.com" + last_updated: datetime = Field(default_factory=datetime.now) + + user = User(username="bob") + assert user.__fields_set__ == {"username"} + user = User(username="bob", email="bob@test.com") + assert user.__fields_set__ == {"username", "email"} + user = User( + username="bob", + email="bob@test.com", + last_updated=datetime.now() - timedelta(days=1), + ) + assert user.__fields_set__ == {"username", "email", "last_updated"} From fb3fd682d91a005d02c08f03c62a09cef729628a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Sun, 28 Aug 2022 00:57:45 +0200 Subject: [PATCH 3/3] =?UTF-8?q?=F0=9F=8E=A8=20Format=20imports=20in=20test?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/test_fields_set.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/test_fields_set.py b/tests/test_fields_set.py index 843953ccea..56f4ad0144 100644 --- a/tests/test_fields_set.py +++ b/tests/test_fields_set.py @@ -1,5 +1,6 @@ from datetime import datetime, timedelta -from sqlmodel import SQLModel, Field + +from sqlmodel import Field, SQLModel def test_fields_set():