设置:
# Pydantic Models
class TMDB_Category(BaseModel):
name: str = Field(alias="strCategory")
description: str = Field(alias="strCategoryDescription")
class TMDB_GetCategoriesResponse(BaseModel):
categories: list[TMDB_Category]
@router.get(path="category", response_model=TMDB_GetCategoriesResponse)
async def get_all_categories():
async with httpx.AsyncClient() as client:
response = await client.get(Endpoint.GET_CATEGORIES)
return TMDB_GetCategoriesResponse.parse_obj(response.json())
问题:
创建响应时正在使用别名,我希望避免使用它。我只需要这个别名来正确映射传入的数据,但在返回响应时,我希望使用实际的字段名
实际响应:
{
"categories": [
{
"strCategory": "Beef",
"strCategoryDescription": "Beef is ..."
},
{
"strCategory": "Chicken",
"strCategoryDescription": "Chicken is ..."
}
}
预期响应:
{
"categories": [
{
"name": "Beef",
"description": "Beef is ..."
},
{
"name": "Chicken",
"description": "Chicken is ..."
}
}
切换别名和字段名,并使用
allow_population_by_field_name
model config选项:让别名配置要返回的字段的名称,但允许
allow_population_by_field_name
能够解析字段使用不同名称的数据另一种选择(可能不会像流行的那样)是使用除
pydantic
之外的反序列化库。例如,Dataclass向导库就是支持此特定用例的库。如果需要Field(alias=...)
提供的相同往返行为,可以将all
参数传递给json_field
函数。请注意,有了这样一个库,您确实失去了执行完整类型验证的能力,这可以说是pydantic最大的优势之一;但是,它会以类似于pydantic的方式执行类型转换。我觉得验证没有那么重要还有一些原因,我在下面列出了这些原因为什么我会认为数据验证是一个好的 一般功能:
为了证明这一点,这里有一个使用dataclass-wizard库(依赖于使用
dataclasses
而不是pydantic模型)的上述用例的简单示例:运行它的代码如下所示:
测量性能如果有人好奇的话,我已经设置了一个快速的基准测试来比较pydantic与DataClass的反序列化和序列化时间:
以及基准测试结果(在Mac OS Big Sur、Python 3.9.0上测试):
在他们的文档中,
pydantic
声称总体上是最快的库,但要证明不是这样很简单。如您所见,对于上述数据集,pydantic
在反序列化和序列化过程中大约慢2倍。但值得注意的是pydantic
已经相当快了相关问题 更多 >
编程相关推荐