from typing import Dict, Optional from pydantic import BaseModel class Content(BaseModel): type: str key: str url: Optional[str | None] = None class Tag(BaseModel): status: str content: Content | Dict[str, Content] | None = None class Customer(BaseModel): status: str tags: Dict[str, Tag] | None = None class Redirects(BaseModel): customers: Dict[str, Customer] | None = None if __name__ == "__main__": r = Redirects ( customers = { "cust1": Customer( status="active", tags= { "tag1" : Tag ( status="active", content= Content( type="s3", key="foo", url=None ) ), "tag2" : Tag( status="active", content = { "face1" : Content( type="s3", key="contentface1", url = "foo" ), "face2": Content( type="s3", key="contentface2", url = "bar" ), } ) } ) } ) r.customers['cust2'] = Customer(status="inactive", tags=None) print(r.model_dump_json(indent=2))