Pydantic BaseModel类中实例化后的Alter字段

2024-04-20 01:38:13 发布

您现在位置:Python中文网/ 问答频道 /正文

对于如下所示的Pydantic类,我希望通过应用replace操作来转换foo字段:

from typing import List
from pydantic import BaseModel

class MyModel(BaseModel):
    foo: List[str]

my_object = MyModel(foo="hello-there")
my_object.foo = [s.replace("-", "_") for s in my_object.foo]

创建对象时,如何在类中正确执行replace操作?如果没有Pydantic,我只会在__init(self, foo)内实现,但是由于Pydantic创建了自己的__init__实现,我不知道如何准确地进行


Tags: fromimporttypingobjectfooinitmyreplace
2条回答

使用pydantic BaseModel

似乎您必须重写basemodels init方法,如下所示:

from typing import List
from pydantic import BaseModel

class MyModel(BaseModel):
    foo: List[str]

    def __init__(self, **data):
        data["foo"] = [s.replace("-", "_") for s in data["foo"]]
        super().__init__(**data)

my_object = MyModel(foo=["hello-there"])

print(my_object)
# Outputs foo=['hello_there']

使用Pydantic数据类

。。。或者您也可以将其转换为pydantic数据类,并使用pydantic提供的post init dunder在实例化时执行其他操作。e、 g:

from typing import List
from pydantic.dataclasses import dataclass

@dataclass
class MyModel():
    foo: List[str]

    def __post_init__(self):
        self.foo = [s.replace("-", "_") for s in self.foo]

my_object = MyModel(foo=["hello-there"])

print(my_object)

# Outputs foo=['hello_there']

使用@validator装饰器(在本例中使用each_item=True选项,因为我们希望验证器查看列表中的每个项目,而不是列表本身):

from typing import List
from pydantic import BaseModel, validator

class MyModel(BaseModel):
    foo: List[str]

    @validator('foo', each_item=True)
    def replace_hyphen(cls,v):
        return v.replace("-","_")

my_object = MyModel(foo=["hello-there"])

print(my_object)
# Outputs foo=['hello_there']

或者,如果您更喜欢数据类:

from typing import List
from pydantic import validator
from pydantic.dataclasses import dataclass

@dataclass
class MyModelDC():
    foo: List[str]

    @validator('foo', each_item=True)
    def replace_hyphen(cls,v):
        return v.replace("-","_")

my_objectDC = MyModelDC(foo=["hello-there"])

print(my_objectDC)
# Outputs foo=['hello_there']

相关问题 更多 >