从pydantic类中排除字段
我有一个这样的类:
from pydantic import BaseModel, Field
class MyClass(BaseModel):
field_1: str = Field(description='Field 1')
field_2: dict = Field(description='Field 2')
field_3: list = Field(description='Field 3')
我想创建一个子类,继承这个 MyClass 类,像这样:
class MyChildClass(MyClass):
field_4: str = Field(description='Field 4')
在创建这个子类的时候,我需要禁用 field_2 的继承(或者说在继承后把 field_2 从 MyChildClass 中移除)。
我该怎么做呢?有什么好的做法吗?
2 个回答
0
在Pydantic中,你可以很简单地通过使用exclude参数来实现这个功能。
from pydantic import BaseModel, Field
class MyClass(BaseModel):
field_1: str = Field(description='Field 1')
field_2: dict = Field(description='Field 2')
field_3: list = Field(description='Field 3')
class MyChildClass(MyClass, exclude={'field_2'}):
field_4: str = Field(description='Field 4')
或者在创建一个实例的时候,你可以通过使用exclude参数来指定那些你不想继承的字段。
child_instance = MyChildClass(field_1='value1', field_3=['value3'], field_4='value4', exclude={'field_2'})
1
在PydanticV1中,这是不可能的:可以在这里查看讨论。
我不太确定,但在PydanticV2中应该是可以做到的(https://github.com/pydantic/pydantic/discussions/6699)。
谈到最佳实践,我会这样做:
from pydantic import BaseModel, Field
class MyClassBase(BaseModel):
field_1: str = Field(description='Field 1')
field_3: list = Field(description='Field 3')
class MyClass1(MyClassBase):
field_2: dict = Field(description='Field 2')
class MyClass2(MyClassBase):
field_4: str = Field(description='Field 4')