Estoy escribiendo una post-api usando fastapi. El formato de solicitud requerido es:
{ "leadid":LD123, "parties":[ { "uid":123123, "cust_name":"JOhn Doe", }, ...]}El código fastapi en python es:
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"}Cuando visito SwaggerUI para enviar la respuesta, el error es "Error 422: Entidad no procesable" . Además, el documento SwaggerUI establece
{ "detail": [ { "loc": [ "body" ], "msg": "unhashable type: 'Customer'", "type": "type_error" } ] }No sé cómo crear esta estructura dict () para la carga útil de la solicitud sin crear una clase basada en pydantic separada llamada Cliente. Por favor, dígame cómo rectificar el error.
Pytdantic BaseClass no es hashable. Hay una discusión sobre esta función, supongo que no se implementará. Hay una solución en la discusión, para su caso puede probar esto:
from pydantic import BaseModel from typing import Set class MyBaseModel(BaseModel): def __hash__(self): # make hashable BaseModel subclass return hash((type(self),) + tuple(self.__dict__.values())) class Customer(MyBaseModel): # Use hashable sublclass for your model UID: str CustName: str class PackageIn(BaseModel): lead_id: str parties: Set[Customer] # threshold: Optional[int] = 85 data = { "lead_id": 'LD123', "parties": [ { "UID": 123123, "CustName": "JOhn Doe", }]} PackageIn.parse_obj(data) # This part fastapi will make on post request, just for test > <PackageIn lead_id='LD123' parties={<Customer UID='123123' CustName='JOhn Doe'>}>