我有一个 pydantic 模型,我想动态排除其中的字段。
我可以通过覆盖dict
模型上的函数来做到这一点,以便它可以采用我的自定义标志,例如:
class MyModel(BaseModel):
field: str
def dict(self, **kwargs):
if ('exclude_special_fields' in kwargs):
super().dict(exclude={"field": True}, **kwargs)
super().dict(**kwargs)
Run Code Online (Sandbox Code Playgroud)
.dict
但是,如果我的模型是调用它的另一个模型的子模型,则这不起作用:
class AnotherModel(BaseModel):
models: List[MyModel]
AnotherModel(models=[...]).dict(exclude_special_fields=True) # does not work
Run Code Online (Sandbox Code Playgroud)
这是因为当MyModel.dict()
调用时,它不会使用与父级相同的参数来调用。
我dict
也可以在父模型上编写一个覆盖,以指定任何子组件的排除(例如exclude={"models": {"__all__": {"field": True}}}
),但在我的现实世界示例中,我有许多使用这个子模型的父模型,并且我不想让为每一个写一个覆盖。
无论如何,我可以确保子模型知道何时排除字段吗?
额外的上下文
额外的上下文对于问题来说并不完全重要,但我想要这样做的原因是排除模型上的某些字段(如果它从 API 调用返回)。