Python FastAPI请求中的不可破坏类型

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):

我正在使用fastapi编写post api。所需的请求格式为:

{
   "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模型。虽然这可能不是问题的根本原因,但只是一个建议