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