]> git.ipfire.org Git - thirdparty/fastapi/sqlmodel.git/commitdiff
🐛 Fix fields marked as "set" in models (#117)
authorstatt8900 <30441880+statt8900@users.noreply.github.com>
Sat, 27 Aug 2022 22:59:09 +0000 (18:59 -0400)
committerGitHub <noreply@github.com>
Sat, 27 Aug 2022 22:59:09 +0000 (22:59 +0000)
Co-authored-by: Michael Statt <michael.statt@modelyst.io>
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
sqlmodel/main.py
tests/test_fields_set.py [new file with mode: 0644]

index 86e28b33334e46778f2762b9cd9145b362a6c7d7..8af077dafec0fce3e5b6c642b1893a82adf5a2ed 100644 (file)
@@ -499,9 +499,9 @@ class SQLModel(BaseModel, metaclass=SQLModelMetaclass, registry=default_registry
         # 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__:
diff --git a/tests/test_fields_set.py b/tests/test_fields_set.py
new file mode 100644 (file)
index 0000000..56f4ad0
--- /dev/null
@@ -0,0 +1,21 @@
+from datetime import datetime, timedelta
+
+from sqlmodel import Field, SQLModel
+
+
+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"}