from pydantic import BaseModel, Field, model_validator from typing import Optional, Any class BaseLinkedModel(BaseModel): model_config = dict(arbitrary_types_allowed=True) @model_validator(mode="before") @classmethod def auto_populate_ids(cls, data: dict[str, Any]) -> dict[str, Any]: if isinstance(data, dict): for key, value in data.copy().items(): if not key.endswith("_id") and hasattr(value, "id") and value is not None: id_key = key + "_id" if id_key in data: # If the id_key already exists, ensure it matches the value's id if data[id_key] != value.id: raise ValueError(f"ID mismatch for {key}: {data[id_key]} != {value.id}") else: # If the id_key does not exist, set it to the value's id data[id_key] = value.id return data