model: check for duplicate objects

return empty dict for detached instances inside dict_recursive
This commit is contained in:
Masen Furer 2024-12-31 00:36:18 -08:00
parent 848b87070c
commit 3253088700
No known key found for this signature in database
GPG Key ID: 2AE2BD5531FF94F4

View File

@ -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):