Comments (7)
This came up on Google before any pydantic thread, so for anyone else looking it's surprisingly easy:
from pydantic import BaseModel
from enum import Enum
custom_enum_values = {
"cool": "stuff",
"other": "thing",
"foo": "fighters"
}
TypeEnum = Enum("TypeEnum", custom_enum_values)
class CustomModel(BaseModel):
type: TypeEnum = TypeEnum.cool
a = CustomModel()
print(a.type.name) # 'cool'
print(a.type.value) # 'stuff'
b = CustomModel(type="fighters")
print(f"{b.type.name.capitalize()} {b.type.value.capitalize()}") # 'Foo Fighters'
from fastapi.
@justindujardin's method works, but in my case it somehow didnt show the enum values in OpenAPI docs schemas.
This SO answer says that's because the class does not inherit from str
as well.
As a workaround, I created a temp class that inherits from both, str
as well as Enum
, and then applied the same technique mentioned by @justindujardin. This then showed up in the docs as well:
class TempEnum(str, Enum):
pass
TypeEnum = TempEnum("TypeEnum", custom_enum_values)
from fastapi.
In theory, you could create an enum dynamically with the functional API: https://docs.python.org/3/library/enum.html#functional-api
And then you could use that with Pydantic dynamic's create_model
with that dynamic enum.
I haven't personally tried it yet 😅 .
Nevertheless, if the possible values are "unbounded", if they can be a lot (stored in MongoDB), it might end up being better to use a frontend-side auto-completion widget, with search connected to the API, that then sends the query to MogoDB and keeps filtering the selectable values. Otherwise, you could have a very long select in the front end, that apart from looking ugly could make the browser unresponsive, etc.
from fastapi.
I assume you solved your problem so I'll close this issue now. But feel free to add more comments or create new issues.
from fastapi.
@zero0nee @tiangolo
I have a similar use case and implemented something as described in this thread.
Now, my question is how can I make this truly dynamic i.e refresh the dynamic enums as updates are made to my database
from fastapi.
@zero0nee @tiangolo I have a similar use case and implemented something as described in this thread. Now, my question is how can I make this truly dynamic i.e refresh the dynamic enums as updates are made to my database
You can try this: https://gist.github.com/myuanz/03f3e350fb165ec3697a22b559a7eb50
from fastapi.
Assuming the original need was handled, this will be automatically closed now. But feel free to add more comments or create new issues or PRs.
from fastapi.
Related Issues (20)
- No streaming interface can not support concurrency for two fastapi servers
- Using pydantic Json Type as Form data type doesn't work HOT 1
- Raw docstring (leading `r`) defeats form feed `\f` truncation HOT 3
- OpenAPI Example with multipart/form-data not showing up HOT 5
- [BUG] Using Nested Pydantic models and `params: MyModel = Depends()` forces OpenAPI docs GET methods to require a request body. HOT 6
- How to fix this bug? HOT 2
- [BUG] Upgrade python-mulipart==0.0.7 from low version fastapi upload file may be 400 HOT 4
- Use `RootModel` as query parameter HOT 2
- Context managers in `Depends` are broken after 0.106 HOT 17
- Middleware runs twice HOT 8
- Support for Pydantic deprecated fields HOT 1
- axios can't receive error response status code
- Potential footgun when using custom `Response(background=<Task()>)` in conjunction with injected `BackgroundTasks` - the custom response overwrites the tasks HOT 3
- lifespan
- Breaking change with path parameters when updating to pydantic>=2 from pydantic<2 HOT 1
- trying to live video stream using Fastapi
- Package on test.pypi.org is broken
- middleware type
- It throws an exception when I specify return Http status code
- When backend restart the frontend request a protected api cause an unhandle exception: Exception in ASGI application HOT 3
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from fastapi.