问题描述
以前,我将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
转换的方式:validator和
root_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