I am trying to create a dynamic model using Python's pydantic library. My input data is a regular dict. However, the content of the dict (read: its keys) may vary.
I am wondering how to dynamically create a pydantic model which is dependent on the dict's content?
I created a toy example with two different dicts (inputs1 and inputs2). Let's assume the nested dict called strategy may be different. Based on strategy/name I know in advance which fields will exist in strategy. I need to create the pydantic model based on strategy/name.
from pydantic import BaseModel
inputs1 = {
"universe": {"name": "test_universe", "ccy": "USD"},
"price_src": "csv",
"strategy": {"name": "test_strat1"},
}
inputs2 = {
"universe": {"name": "test_universe", "ccy": "USD"},
"price_src": "csv",
"strategy": {"name": "test_strat2", "periods": 10},
}
class Universe(BaseModel):
name: str
ccy: str = "EUR"
strategy_name = "test_strat2"
if strategy_name == "test_strat1":
inputs = inputs1
class Strategy(BaseModel):
name: str
elif strategy_name == "test_strat2":
inputs = inputs2
class Strategy(BaseModel):
name: str
periods: int
class StaticModel(BaseModel):
universe: Universe
price_src: str = "csv"
strategy: Strategy
static_model = StaticModel(**inputs)
My expected output if ``strategy_name == "test_strat1":
universe=Universe(name='test_universe', ccy='USD') price_src='csv' strategy=Strategy(name='test_strat1')
My expected output if ``strategy_name == "test_strat2":
universe=Universe(name='test_universe', ccy='USD') price_src='csv' strategy=Strategy(name='test_strat2', periods=10)
I was thinking about using pydantic's create_model function. However, I don't understand how to dynamically define the fields.