Source code for simstack.util.custom_model_dump

from typing import Dict, Any


[docs] async def custom_model_dump(self, **kwargs) -> Dict[str, Any]: """ Custom model dump method to handle the conversion of model instances to dictionaries. This method recursively traverses dictionaries and lists to convert any nested model instances to their dictionary representation. :param self: The model instance :param kwargs: Additional keyword arguments :return: A dictionary representation of the model instance """ # First get the dictionary from the standard model_dump filtered_kwargs = {k: v for k, v in kwargs.items() if k != "engine"} data = self.model_dump(**filtered_kwargs) # Process each field - the key is to process the original values from self for field_name, field in self.model_fields.items(): field_value = getattr(self, field_name) # Skip None values if field_value is None: continue data[field_name] = await _recursive_process(field_value, **kwargs) return data
async def _recursive_process(obj, **kwargs): """ Helper function to recursively process an object that might contain models """ if hasattr(obj, "custom_model_dump"): return await obj.custom_model_dump(**kwargs) elif isinstance(obj, dict): return {k: await _recursive_process(v, **kwargs) for k, v in obj.items()} elif isinstance(obj, list): return [await _recursive_process(item, **kwargs) for item in obj] else: return obj async def _process_container(container, **kwargs): """ Helper function to recursively process dictionaries and lists, converting any model instances to their dictionary representation. :param container: The container to process (dict or list) :param kwargs: Additional keyword arguments :return: Processed container with model instances converted to dictionaries """ if isinstance(container, dict): result = {} for k, v in container.items(): if hasattr(v, "custom_model_dump"): result[k] = await v.custom_model_dump(**kwargs) elif isinstance(v, (dict, list)): result[k] = await _process_container(v, **kwargs) else: result[k] = v return result elif isinstance(container, list): result = [] for item in container: if hasattr(item, "custom_model_dump"): result.append(await item.custom_model_dump(**kwargs)) elif isinstance(item, (dict, list)): result.append(await _process_container(item, **kwargs)) else: result.append(item) return result return container