from pydantic import BaseModel, SerializeAsAny class commonbase( BaseModel, revalidate_instances="subclass-instances", # toogle to generate error ): ... class basechild(commonbase): test_val: int = 1 class derivedchild(basechild): test_val2: int = 2 class container(commonbase): ct_child_1: dict[str, basechild] = {} ct_child_2: SerializeAsAny[dict[str, basechild]] = {} ct_child_3: dict[str, SerializeAsAny[basechild]] = {} if __name__ == "__main__": test_val = container( ct_child_1={"test1": derivedchild()}, ct_child_2={"test2": derivedchild()}, ct_child_3={"test3": derivedchild()}, ) print(test_val.model_dump_json(indent=1)) print(test_val.model_dump()) assert "test_val2" not in test_val.model_dump()["ct_child_1"]["test1"] assert "test_val2" in test_val.model_dump()["ct_child_2"]["test2"] assert "test_val2" in test_val.model_dump()["ct_child_3"]["test3"]