pydantic中是否有任何post_load?

问题描述

以前,我将marshmallow库与Flask一起使用。前段时间,我尝试使用Pydantic进行FastAPI。乍一看,pydantic似乎与masrhmallow类似,但仔细检查后发现它们有所不同。对我而言,它们之间的主要区别是来自marshmallow的{​​{3}}方法。我在pydantic中找不到任何类似物。

post_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

此外,它不仅用于验证。代码示例仅用于视觉理解,请不要对其进行分析,我只是发明了它。

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

解决方法

是的,您可以使用Pydantic的std::thread decorator进行预加载,后加载,模型验证等。

这是一个后加载示例

@validator
,

这不是很明显,但是pydantic's验证程序返回该字段的值。因此,有两种处理post_load转换的方式:validatorroot_validator

validator获取字段值作为参数并返回其值。 root_validator是相同的,但是会操纵整个对象。

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