从pydantic类中排除字段

0 投票
2 回答
64 浏览
提问于 2025-04-14 16:38

我有一个这样的类:

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')

撰写回答