From 325308870095c41fe1b036859eec4446c75bd65a Mon Sep 17 00:00:00 2001 From: Masen Furer Date: Tue, 31 Dec 2024 00:36:18 -0800 Subject: [PATCH] model: check for duplicate objects return empty dict for detached instances inside dict_recursive --- reflex/model.py | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/reflex/model.py b/reflex/model.py index de63589fc..ae6c3276b 100644 --- a/reflex/model.py +++ b/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):