Python FastAPI请求中的不可破坏类型
我正在使用fastapi编写post api。所需的请求格式为:Python FastAPI请求中的不可破坏类型,python,fastapi,pydantic,Python,Fastapi,Pydantic,我正在使用fastapi编写post api。所需的请求格式为: { "leadid":LD123, "parties":[ { "uid":123123, "cust_name":"JOhn Doe", }, ...]} python中的fastapi代码是: class Customer(BaseModel):
{
"leadid":LD123,
"parties":[
{
"uid":123123,
"cust_name":"JOhn Doe",
}, ...]}
python中的fastapi代码是:
class Customer(BaseModel):
UID: str
CustName: str
class PackageIn(BaseModel):
lead_id: str
parties: Set[Customer]
# threshold: Optional[int] = 85
app = FastAPI()
@app.post('/')
async def nm_v2(package:PackageIn):
return {"resp":"Response"}
当我访问SwaggerUI提交响应时,错误是“422错误:不可处理实体”。此外,大摇大摆的文档声明
{
"detail": [
{
"loc": [
"body"
],
"msg": "unhashable type: 'Customer'",
"type": "type_error"
}
]
}
我不知道如何为请求负载创建这个dict()结构,而不创建一个单独的基于pydantic的类Customer。请告诉我如何更正错误。Pytdanic基类不可散列。关于这个特性有一个问题,我想它不会被实现。讨论中有解决方法,对于您的案例,您可以尝试以下方法: 来自pydantic import BaseModel的
从键入导入集
类别MyBaseModel(BaseModel):
定义散列(self):#生成可散列的BaseModel子类
返回散列((类型(self),)+元组(self.\uu dict.\uu.values()))
类Customer(MyBaseModel):#为您的模型使用哈希子类
UID:str
客户名称:str
类别包装(基本型号):
领导id:str
缔约方:集合[客户]
#阈值:可选[int]=85
数据={
“潜在客户id”:“LD123”,
“各方”:[
{
“UID”:123123,
“客户名称”:“JOhn Doe”,
}]}
PackageIn.parse_obj(数据)#这部分fastapi将根据post请求生成,仅用于测试
>
Pytdantic基类不可散列。关于这个特性有一个问题,我想它不会被实现。讨论中有解决方法,对于您的案例,您可以尝试以下方法:
来自pydantic import BaseModel的
从键入导入集
类别MyBaseModel(BaseModel):
定义散列(self):#生成可散列的BaseModel子类
返回散列((类型(self),)+元组(self.\uu dict.\uu.values()))
类Customer(MyBaseModel):#为您的模型使用哈希子类
UID:str
客户名称:str
类别包装(基本型号):
领导id:str
缔约方:集合[客户]
#阈值:可选[int]=85
数据={
“潜在客户id”:“LD123”,
“各方”:[
{
“UID”:123123,
“客户名称”:“JOhn Doe”,
}]}
PackageIn.parse_obj(数据)#这部分fastapi将根据post请求生成,仅用于测试
>
各方
应该是客户的列表。您已将其定义为客户的集合。此外,客户属性的名称是错误的<代码>UID
!=uid
,不区分大小写和CustName
!=<代码>客户名称
除非它正在进行翻译。而uid
应该是int
,而不是str
。问题在于Set[Customer]
,通常pydantic模型不可散列,因此Set无法检查给定项是否已在集合中。此外,leadid的值似乎不是字符串。这可能会引起问题。我建议用双引号括起来,因为请求将使用纯JSON格式,转换为python,然后转换为pydantic模型。虽然这可能不是问题的根本原因,但仅仅是一个建议各方
应该是一个客户列表
。您已将其定义为客户的集合。此外,客户属性的名称是错误的<代码>UID
!=uid
,不区分大小写和CustName
!=<代码>客户名称除非它正在进行翻译。而uid
应该是int
,而不是str
。问题在于Set[Customer]
,通常pydantic模型不可散列,因此Set无法检查给定项是否已在集合中。此外,leadid的值似乎不是字符串。这可能会引起问题。我建议把它用双引号括起来”,因为请求将使用纯JSON格式,转换成python,然后转换成pydantic模型。虽然这可能不是问题的根本原因,但只是一个建议