[英]Validating json with pydantic (fastapi)
所以我有一个看起来像这样的请求
[
{
"Code": "EVR-T-0dsfdsdf532",
"Agent": "pacman",
"Kilometrage": "60000",
"Operation": "Vidange",
"Piece_Consomable": "filtre à air",
"Quantité": 1,
"UnitPrice": "200.00",
"Montant": 200,
"Mainoeuvre": 100
},
{
"Code": "EVR-T-ddsdf53dfds2",
"Agent": "pacman",
"Kilometrage": "60000",
"Operation": "Pneumatique",
"Piece_Consomable": "(Autre) Uiop",
"Quantité": 1,
"UnitPrice": "200.00"
}
]
我的代码看起来像这样
@app.post("/utilities/Entretien/submit", status_code=status.HTTP_200_OK)
async def create_item(item: Request, db: Session = Depends(get_db)):
operations = await item.json()
for i in operations:
i : EntretienModel
new_operation = TableEntretien(**i)
db.add(new_operation)
db.commit()
db.refresh(new_operation)
return {"ping": "pong"}
我基本上是循环遍历数组,然后将每个对象插入数据库中,我正在寻找一种可以使用像这样的 pydantic 模型验证每个对象的解决方案:
class EntretienModel(BaseModel):
Code: str
Agent: str
Kilometrage: int
Operation: str
Piece_Consomable: str
Quantité: int
UnitPrice: float
Montant: int
Mainoeuvre: Union[int, None] = None
或者比我更好的解决方案,谢谢。
在 FastAPI 操作中,您可以直接使用 Pydantic 模型作为参数。 根据FastAPI 教程:
要声明请求正文,您可以使用Pydantic模型及其所有功能和优势。
[...]
仅使用该 Python 类型声明,FastAPI 将:
- 以 JSON 格式读取请求的正文。
- 转换相应的类型(如果需要)。
- 验证数据
- [...]
例子:
@app.post("/utilities/Entretien/submit", status_code=status.HTTP_200_OK)
async def create_item(operations: List[EntretienModel], db: Session = Depends(get_db)):
...
您可以使用parse_obj_as
Pydantic 辅助函数来解析字典列表。 所以假设item.json()
返回一个 JSON 字符串,你可以这样做:
from pydantic import parse_obj_as
@app.post("/utilities/Entretien/submit", status_code=status.HTTP_200_OK)
async def create_item(item: Request, db: Session = Depends(get_db)):
operations = await item.json()
try:
validated_operations = parse_obj_as(List[EntretienModel], json.loads(operations))
for i in validated_operations:
i : EntretienModel
new_operation = TableEntretien(**i)
db.add(new_operation)
db.commit()
db.refresh(new_operation)
except ValidationError as e:
print(e)
这将验证item
中的每个 json 记录作为字典。 从那里您可以继续将记录插入数据库。 parse_obj_as 文档
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.