使用请求体模型的可选字段
有时候我们希望某些字段是可选的,即在请求体中可以缺失。在Pydantic中,我们可以使用typing.Optional来定义可选字段。下面是一个示例:
代码语言:javascript复制from typing import Optional
class User(BaseModel):
name: str
email: str
age: Optional[int] = None
在上面的示例中,我们将age字段定义为可选字段,并设置默认值为None。这意味着客户端可以发送一个不包含age字段的请求体,而FastAPI会将其转换为一个age值为None的User对象。
使用请求体模型的嵌套字段
有时候我们需要验证请求体中的嵌套字段,即请求体中的某个字段又包含了一个对象。在Pydantic中,我们可以使用嵌套模型来处理这种情况。下面是一个示例:
代码语言:javascript复制from typing import List
class Item(BaseModel):
name: str
price: float
class User(BaseModel):
name: str
email: str
age: Optional[int] = None
items: List[Item] = []
在上面的示例中,我们定义了一个名为Item的嵌套模型,用于验证请求体中的items字段。然后我们将items字段定义为一个列表类型,其元素类型为Item。这样,当客户端向服务器发送一个包含items字段的请求体时,FastAPI会自动使用Item模型来验证items字段中的每个元素。
使用请求体模型的校验器
在Pydantic中,我们还可以使用校验器(validator)来进一步验证请求体数据。校验器是一种可调用对象,用于对请求体数据进行额外的验证。下面是一个示例:
代码语言:javascript复制from pydantic import validator
class User(BaseModel):
name: str
email: str
age: Optional[int] = None
@validator("name")
def name_must_contain_space(cls, v):
if " " not in v:
raise ValueError("must contain space")
return v
@validator("age", pre=True)
def age_must_be_positive(cls, v):
if v is not None and v < 0:
raise ValueError("must be positive")
return v
在上面的示例中,我们定义了两个校验器。第一个校验器用于验证name字段中是否包含空格。如果name字段中不包含空格,则校验器会抛出一个ValueError异常,表示请求体数据无效。第二个校验器用于验证age字段中的值是否为正数。由于age字段是可选的,因此我们需要在校验器中使用pre=True参数来确保该校验器在默认值验证之前执行。