我有一个Pydantic Model,它基本上是其他模型的列表,如下所示:
class Thing(BaseModel):
_api: Api = PrivateAttr()
id: int
name: str
class ThingList(BaseModel):
_api: API = PrivateAttr()
__root__ = List[Thing]
这些内容是从我对外部API进行的API调用的JSON内容中解析出来的,例如:
def some_method_somewhere(self, api, **other_args)
...
response = await api.send('GET', url)
return ThingList(__root__=response, api=api)
但是,我不明白如何让Thing
模型的Pydantic实例化接收api
参数。
我能看到的唯一简单的方法是让一些函数返回一个我可以从PrivateAttr(default_factory=func)
调用的全局值,但这很难闻。
这个功能应该尽可能的通用。目前,可以通过迭代Response对象(可以随意假装它来自请求)将ThingList替换为一个普通的列表,但这在将来不一定是真的。(实际上,其他属性很可能来自需要集成到ThingList中的API )。
我理想中的解决方案是在ThingList类中的某个地方扩展一个方法,但是我不知道Pydantic是如何做到这一点的。
发布于 2021-09-08 12:55:52
您可以在封闭模型的__init__
方法中更新嵌套对象的私有属性:
class Thing(BaseModel):
_api: str = PrivateAttr()
id: int
name: str
class ThingList(BaseModel):
_api: str = PrivateAttr()
__root__: List[Thing]
def __init__(self, *, api, **data):
super().__init__(**data)
self._api = api
for item in self.__root__:
item._api = api
https://stackoverflow.com/questions/69102722
复制相似问题