Da mesma forma que você pode declarar validações adicionais e metadados nos parâmetros de funções de operações de rota com Query, Path e Body, você pode declarar validações e metadados dentro de modelos do Pydantic usando Field do Pydantic.
fromtypingimportUnionfromfastapiimportBody,FastAPIfrompydanticimportBaseModel,Fieldapp=FastAPI()classItem(BaseModel):name:strdescription:Union[str,None]=Field(default=None,title="The description of the item",max_length=300)price:float=Field(gt=0,description="The price must be greater than zero")tax:Union[float,None]=None@app.put("/items/{item_id}")asyncdefupdate_item(item_id:int,item:Item=Body(embed=True)):results={"item_id":item_id,"item":item}returnresults
Aviso
Note que Field é importado diretamente do pydantic, não do fastapi como todo o resto (Query, Path, Body, etc).
Você pode então utilizar Field com atributos do modelo:
fromtypingimportUnionfromfastapiimportBody,FastAPIfrompydanticimportBaseModel,Fieldapp=FastAPI()classItem(BaseModel):name:strdescription:Union[str,None]=Field(default=None,title="The description of the item",max_length=300)price:float=Field(gt=0,description="The price must be greater than zero")tax:Union[float,None]=None@app.put("/items/{item_id}")asyncdefupdate_item(item_id:int,item:Item=Body(embed=True)):results={"item_id":item_id,"item":item}returnresults
Field funciona da mesma forma que Query, Path e Body, ele possui todos os mesmos parâmetros, etc.
Detalhes técnicos
Na realidade, Query, Path e outros que você verá em seguida, criam objetos de subclasses de uma classe Param comum, que é ela mesma uma subclasse da classe FieldInfo do Pydantic.
E Field do Pydantic retorna uma instância de FieldInfo também.
Body também retorna objetos de uma subclasse de FieldInfo diretamente. E tem outras que você verá mais tarde que são subclasses da classe Body.
Lembre-se que quando você importa Query, Path, e outros de fastapi, esse são na realidade funções que retornam classes especiais.
Dica
Note como cada atributo do modelo com um tipo, valor padrão e Field possuem a mesma estrutura que parâmetros de funções de operações de rota, com Field ao invés de Path, Query e Body.