我有这个模型:
class Text(BaseModel):
id: str
text: str = None
class TextsRequest(BaseModel):
data: list[Text]
n_processes: Union[int, None]
Run Code Online (Sandbox Code Playgroud)
所以我希望能够接受如下请求:
{"data": ["id": "1", "text": "The text 1"], "n_processes": 8}
Run Code Online (Sandbox Code Playgroud)
和
{"data": ["id": "1", "text": "The text 1"]}.
Run Code Online (Sandbox Code Playgroud)
现在在第二种情况下我得到
{'data': [{'id': '1', 'text': 'The text 1'}], 'n_processes': None}
Run Code Online (Sandbox Code Playgroud)
使用此代码:
app = FastAPI()
@app.post("/make_post/", response_model_exclude_none=True)
async def create_graph(request: TextsRequest):
input_data = jsonable_encoder(request)
Run Code Online (Sandbox Code Playgroud)
n_processes
那么这里我该如何排除呢?
GET
我是 FastAPI 的新手(从 Flask 迁移),我正在尝试为我的路线创建一个 Pydantic 模型:
from fastapi import APIRouter,Depends
from pydantic import BaseModel
from typing import Optional,List
router = APIRouter()
class SortModel(BaseModel):
field: Optional[str]
directions: List[str]
@router.get("/pydanticmodel")
def get_sort(criteria: SortModel = Depends(SortModel)):
pass #my code for handling this route.....
Run Code Online (Sandbox Code Playgroud)
当我跑步时 curl -X GET http://localhost:XXXX/pydanticmodel?directions=up&directions=asc&field=id
我得到422 Unprocessable Entity: {"detail":[{"loc":["body"],"msg":"field required","type":"value_error.missing"}]}
但如果我正在改变directions:List[str]
->directions: str
我正在200 OK
接受directions="asc"
. str
对于查询参数有效而List[str]
无效的原因是什么?我究竟做错了什么?
谢谢。
是否可以调用所有验证器来获取完整的错误列表?
@validator('password', always=True)
def validate_password1(cls, value):
password = value.get_secret_value()
min_length = 8
if len(password) < min_length:
raise ValueError('Password must be at least 8 characters long.')
return value
@validator('password', always=True)
def validate_password2(cls, value):
password = value.get_secret_value()
if not any(character.islower() for character in password):
raise ValueError('Password should contain at least one lowercase character.')
return value
Run Code Online (Sandbox Code Playgroud)
当前的行为似乎一次调用一个验证器。
我的 Pydantic 课程:
class User(BaseModel):
email: EmailStr
password: SecretStr
Run Code Online (Sandbox Code Playgroud)
如果我没有在请求中包含email
, 或password
, 字段,那么我会在数组中得到两个验证失败,这就是我想要对该字段执行的操作password
,但当前的行为似乎调用了一个,如果失败则抛出立即出现错误。
所以我有以下代码行:
item: Optional[int] = Field(None, ge=1, le=168)
Run Code Online (Sandbox Code Playgroud)
我也希望有可能设定-1
价值。因此,我需要排除零值,但我想允许一个值和来自to-1
的值。1
168
有什么办法可以做到这一点吗?
我的GET
端点收到一个需要满足以下条件的查询参数:
int
0 和 10 之间1.
直接使用Query(gt=0, lt=10)
. 但是,我不清楚如何扩展Query
以进行额外的自定义验证,例如2.
. 该文档最终导致了 pydantic。但是,当第二次验证失败时,我的应用程序遇到内部服务器错误2.
。
下面是一个最小范围的示例
from fastapi import FastAPI, Depends, Query
from pydantic import BaseModel, ValidationError, validator
app = FastAPI()
class CommonParams(BaseModel):
n: int = Query(default=..., gt=0, lt=10)
@validator('n')
def validate(cls, v):
if v%2 != 0:
raise ValueError("Number is not even :( ")
return v
@app.get("/")
async def root(common: CommonParams = Depends()):
return {"n": common.n}
Run Code Online (Sandbox Code Playgroud)
以下是按预期工作的请求和失败的请求:
# requsts that work …
Run Code Online (Sandbox Code Playgroud) 我想验证pydantic模型的三个模型字段。为此,我正在从 pydantic 导入 root_validator。低于错误。我在https://pydantic-docs.helpmanual.io/usage/validators/#root-validators 中找到了这个。任何人都可以帮助我。找出下面的错误。from pydantic import BaseModel, ValidationError, root_validator Traceback (最近一次调用): File "", line 1, in ImportError: cannot import name 'root_validator' from 'pydantic' (C:\Users\Lenovo\AppData\Local\Programs\ Python\Python38-32\lib\site-packages\pydantic__init__.py)
我试过
@validator
def validate_all(cls,v,values,**kwargs):
Run Code Online (Sandbox Code Playgroud)
我从一些常见的字段父模型继承了我的 pydantic 模型。仅显示父类字段的值,但不显示我的子类字段。例如
class Parent(BaseModel):
name: str
comments: str
class Customer(Parent):
address: str
phone: str
@validator
def validate_all(cls,v,values, **kwargs):
#here values showing only (name and comment) but not address and phone.
Run Code Online (Sandbox Code Playgroud) 有没有办法将pydantic模型转换为fastapi中的查询参数?
我的一些端点通过主体传递参数,但其他一些端点直接在查询中传递它们。所有这些端点共享相同的数据模型,例如:
class Model(BaseModel):
x: str
y: str
Run Code Online (Sandbox Code Playgroud)
我想避免在我的“查询参数端点”的定义中重复我对此模型的定义,例如test_query
在此代码中:
class Model(BaseModel):
x: str
y: str
@app.post("/test-body")
def test_body(model: Model): pass
@app.post("/test-query-params")
def test_query(x: str, y: str): pass
Run Code Online (Sandbox Code Playgroud)
这样做最干净的方法是什么?
使用 ORM,我想要执行一个 POST 请求,让某些字段具有null
值,该值将在数据库中转换为那里指定的默认值。
问题是 OpenAPI (Swagger) docs忽略了默认值None
,并且默认情况下仍然提示 a UUID
。
from fastapi import FastAPI
from pydantic import BaseModel
from typing import Optional
from uuid import UUID
import uvicorn
class Table(BaseModel):
# ID: Optional[UUID] # the docs show a example UUID, ok
ID: Optional[UUID] = None # the docs still shows a uuid, when it should show a null or valid None value.
app = FastAPI()
@app.post("/table/", response_model=Table)
def create_table(table: Table):
# here we call …
Run Code Online (Sandbox Code Playgroud) 我有这个应用程序:
import enum
from typing import Annotated, Literal
import uvicorn
from fastapi import FastAPI, Query, Depends
from pydantic import BaseModel
app = FastAPI()
class MyEnum(enum.Enum):
ab = "ab"
cd = "cd"
class MyInput(BaseModel):
q: Annotated[MyEnum, Query(...)]
@app.get("/")
def test(inp: MyInput = Depends()):
return "Hello world"
def main():
uvicorn.run("run:app", host="0.0.0.0", reload=True, port=8001)
if __name__ == "__main__":
main()
Run Code Online (Sandbox Code Playgroud)
curl http://127.0.0.1:8001/?q=ab
或curl http://127.0.0.1:8001/?q=cd
返回“Hello World”
但任何这些
curl http://127.0.0.1:8001/?q=aB
curl http://127.0.0.1:8001/?q=AB
curl http://127.0.0.1:8001/?q=Cd
返回422Unprocessable Entity
这是有道理的。
如何使此验证不区分大小写?
我有以下课程:
class Quiz(BaseModel):
question: str
subject: str
choice: str = Query(choices=('eu', 'us', 'cn', 'ru'))
Run Code Online (Sandbox Code Playgroud)
我可以像这样基于此类渲染表单
@api.post("/postdata")
def post_data(form_data: Quiz = Depends()):
return form_data
Run Code Online (Sandbox Code Playgroud)
如何显示选择字段的下拉列表?
fastapi ×9
pydantic ×8
python ×8
openapi ×2
swagger ×2
database ×1
enums ×1
exception ×1
python-3.x ×1
range ×1
swagger-ui ×1
validation ×1
valueerror ×1