Przeglądaj źródła

model: check for duplicate objects

return empty dict for detached instances inside dict_recursive
Masen Furer 4 miesięcy temu
rodzic
commit
3253088700
1 zmienionych plików z 19 dodań i 6 usunięć
  1. 19 6
      reflex/model.py

+ 19 - 6
reflex/model.py

@@ -261,19 +261,32 @@ class Model(Base, sqlmodel.SQLModel):  # pyright: ignore [reportGeneralTypeIssue
         super().__init_subclass__()
 
     @classmethod
-    def _dict_recursive(cls, value):
+    def _dict_recursive(cls, value, seen_objects: set | None = None):
         """Recursively serialize the relationship object(s).
 
         Args:
             value: The value to serialize.
 
         Returns:
-            The serialized value.
+            The serialized value,
+                or Empty value when the relationship cannot be followed,
+                or None if the value has already been serialized in this descent.
         """
-        if hasattr(value, "dict"):
-            return value.dict()
-        elif isinstance(value, list):
-            return [cls._dict_recursive(item) for item in value]
+        if seen_objects is None:
+            seen_objects = set()
+        if id(value) in seen_objects:
+            return None
+        seen_objects.add(id(value))
+        try:
+            if hasattr(value, "dict"):
+                return value.dict()
+        except sqlalchemy.orm.exc.DetachedInstanceError:
+            return {}
+        if isinstance(value, list):
+            return [
+                cls._dict_recursive(item, seen_objects=seen_objects)
+                for item in value
+            ]
         return value
 
     def dict(self, **kwargs):