Python pydantic中是否有后期加载?

Python pydantic中是否有后期加载?,python,pydantic,Python,Pydantic,以前我用过带烧瓶的图书馆。不久前,我尝试使用FastAPI。乍一看,pydantic似乎与masrhmallow相似,但仔细观察,它们有所不同。对我来说,它们之间的主要区别是来自棉花糖的方法。我在pydantic中找不到任何类似物 post\u load是后处理方法的装饰器。使用它,我可以自己处理返回对象,可以做任何我想做的事情: class ProductSchema(Schema): alias = fields.Str() category = fields.Str()

以前我用过带烧瓶的图书馆。不久前,我尝试使用FastAPI。乍一看,
pydantic
似乎与
masrhmallow
相似,但仔细观察,它们有所不同。对我来说,它们之间的主要区别是来自
棉花糖的方法。我在
pydantic
中找不到任何类似物

post\u load
是后处理方法的装饰器。使用它,我可以自己处理返回对象,可以做任何我想做的事情:

class ProductSchema(Schema):
    alias = fields.Str()
    category = fields.Str()
    brand = fields.Str()

    @post_load
    def check_alias(self, params, **kwargs):
        """One of the fields must be filled"""
        if not any([params.get('alias'), params.get('category'), params.get('brand')]):
            raise ValidationError('No alias provided', field='alias')
        return params
此外,它不仅用于验证。代码示例只是为了直观理解,不要分析它,我刚刚发明了它

所以我的问题是:
pydantic
中是否有任何类似的
post_load

是的,您可以使用pydantic的
@validator
进行预加载、后加载、模型验证等

下面是一个加载后的示例

from pydantic import validator

class Person(BaseModel):
    first_name: str
    second_name: str

    @validator("first_name")
    def make_it_formal(cls, first_name):
        return f"Mr. {first_name.capitalize()}"



p = Person(first_name="egvo", second_name="Example")

p.first_name
Out: Mr. Egvo

这并不明显,但pydantic的验证程序返回字段的值。因此,有两种方法可以处理
post_load
转换:和

validator
获取字段值作为参数并返回其值。
root\u验证器
是相同的,但可以处理整个对象

from pydantic import validator, root_validator


class PaymentStatusSchema(BaseModel):
    order_id: str = Param(..., title="Order id in the shop")
    order_number: str = Param(..., title="Order number in chronological order")
    status: int = Param(..., title="Payment status")

    @validator("status")
    def convert_status(cls, status):
        return "active" if status == 1 else "inactive"

    @root_validator
    def check_order_id(cls, values):
        """Check order id"""
        if not values.get('orderNumber') and not values.get('mdOrder'):
            raise HTTPException(status_code=400, detail='No order data provided')
        return values
默认情况下,
pydantic
将验证器作为后处理方法运行。对于预处理,您应该使用带有
pre
参数的验证器:

    @root_validator
    def check_order_id(cls, values, pre=True):
        """Check order id"""
        # some code here
        return values