class CustomerActivationStatus(str, enum.Enum):
Signup = "Signup"
Active = "Active"
Disabled = "Disabled"
FreeSubscriptionActive = "FreeSubscriptionActive"
class Customer(Table):
signup_guid = UUID()
email: str = Varchar()
created_at: datetime = Timestamptz()
activation_status = Varchar(
choices=CustomerActivationStatus,
default=CustomerActivationStatus.Signup.value
)
CustomerPatchResponseModel = create_pydantic_model(Customer)
@api_v1_router.patch(
"/customer/guid/{signup_guid}",
response_model=CustomerPatchResponseModel,
responses={409: {"model": None}}
)
async def patch_customer_by_guid()
<the code>
Traceback (most recent call last):
File "/projects/customer-api/.venv/lib/python3.9/site-packages/uvicorn/protocols/http/h11_impl.py", line 373, in run_asgi
result = await app(self.scope, self.receive, self.send)
File "/projects/customer-api/.venv/lib/python3.9/site-packages/uvicorn/middleware/proxy_headers.py", line 75, in __call__
return await self.app(scope, receive, send)
File "/projects/customer-api/.venv/lib/python3.9/site-packages/fastapi/applications.py", line 208, in __call__
await super().__call__(scope, receive, send)
File "/projects/customer-api/.venv/lib/python3.9/site-packages/starlette/applications.py", line 112, in __call__
await self.middleware_stack(scope, receive, send)
File "/projects/customer-api/.venv/lib/python3.9/site-packages/starlette/middleware/errors.py", line 181, in __call__
raise exc
File "/projects/customer-api/.venv/lib/python3.9/site-packages/starlette/middleware/errors.py", line 159, in __call__
await self.app(scope, receive, _send)
File "/projects/customer-api/.venv/lib/python3.9/site-packages/starlette/exceptions.py", line 82, in __call__
raise exc
File "/projects/customer-api/.venv/lib/python3.9/site-packages/starlette/exceptions.py", line 71, in __call__
await self.app(scope, receive, sender)
File "/projects/customer-api/.venv/lib/python3.9/site-packages/starlette/routing.py", line 656, in __call__
await route.handle(scope, receive, send)
File "/projects/customer-api/.venv/lib/python3.9/site-packages/starlette/routing.py", line 259, in handle
await self.app(scope, receive, send)
File "/projects/customer-api/.venv/lib/python3.9/site-packages/starlette/routing.py", line 61, in app
response = await func(request)
File "/projects/customer-api/.venv/lib/python3.9/site-packages/fastapi/applications.py", line 161, in openapi
return JSONResponse(self.openapi())
File "/projects/customer-api/.venv/lib/python3.9/site-packages/fastapi/applications.py", line 136, in openapi
self.openapi_schema = get_openapi(
File "/projects/customer-api/.venv/lib/python3.9/site-packages/fastapi/openapi/utils.py", line 387, in get_openapi
definitions = get_model_definitions(
File "/projects/customer-api/.venv/lib/python3.9/site-packages/fastapi/utils.py", line 28, in get_model_definitions
model_name = model_name_map[model]
KeyError: <class 'pydantic.main.Customer'>
CustomerPatchResponseModel = create_pydantic_model(
Customer,
exclude_columns=(Customer.activation_status, Customer.email,)
)
I'm pretty sure fastapi is able to deal with regular pydantic models including enums, so I suspect there's something about how create_pydantic_model
generates these dynamic models.