Extra Data Types
Up to now, you have been using common data types, like:
intfloatstrbool
But you can also use more complex data types.
And you will still have the same features as seen up to now:
- Great editor support.
- Data conversion from incoming requests.
- Data conversion for response data.
- Data validation.
- Automatic annotation and documentation.
Other data types
Here are some of the additional data types you can use:
UUID:- A standard "Universally Unique Identifier", common as an ID in many databases and systems.
- In requests and responses will be represented as a
str.
datetime.datetime:- A Python
datetime.datetime. - In requests and responses will be represented as a
strin ISO 8601 format, like:2008-09-15T15:53:00+05:00.
- A Python
datetime.date:- Python
datetime.date. - In requests and responses will be represented as a
strin ISO 8601 format, like:2008-09-15.
- Python
datetime.time:- A Python
datetime.time. - In requests and responses will be represented as a
strin ISO 8601 format, like:14:23:55.003.
- A Python
datetime.timedelta:- A Python
datetime.timedelta. - In requests and responses will be represented as a
floatof total seconds. - Pydantic also allows representing it as a "ISO 8601 time diff encoding", see the docs for more info.
- A Python
frozenset:- In requests and responses, treated the same as a
set:- In requests, a list will be read, eliminating duplicates and converting it to a
set. - In responses, the
setwill be converted to alist. - The generated schema will specify that the
setvalues are unique (using JSON Schema'suniqueItems).
- In requests, a list will be read, eliminating duplicates and converting it to a
- In requests and responses, treated the same as a
bytes:- Standard Python
bytes. - In requests and responses will be treated as
str. - The generated schema will specify that it's a
strwithbinary"format".
- Standard Python
Decimal:- Standard Python
Decimal. - In requests and responses, handled the same as a
float.
- Standard Python
- You can check all the valid pydantic data types here: Pydantic data types.
Example
Here's an example path operation with parameters using some of the above types.
=== "Python 3.10+"
{!> ../../../docs_src/extra_data_types/tutorial001_an_py310.py!}
=== "Python 3.9+"
{!> ../../../docs_src/extra_data_types/tutorial001_an_py39.py!}
=== "Python 3.6+"
{!> ../../../docs_src/extra_data_types/tutorial001_an.py!}
=== "Python 3.10+ non-Annotated"
!!! tip
Prefer to use the Annotated version if possible.
{!> ../../../docs_src/extra_data_types/tutorial001_py310.py!}
=== "Python 3.6+ non-Annotated"
!!! tip
Prefer to use the Annotated version if possible.
{!> ../../../docs_src/extra_data_types/tutorial001.py!}
Note that the parameters inside the function have their natural data type, and you can, for example, perform normal date manipulations, like:
=== "Python 3.10+"
{!> ../../../docs_src/extra_data_types/tutorial001_an_py310.py!}
=== "Python 3.9+"
{!> ../../../docs_src/extra_data_types/tutorial001_an_py39.py!}
=== "Python 3.6+"
{!> ../../../docs_src/extra_data_types/tutorial001_an.py!}
=== "Python 3.10+ non-Annotated"
!!! tip
Prefer to use the Annotated version if possible.
{!> ../../../docs_src/extra_data_types/tutorial001_py310.py!}
=== "Python 3.6+ non-Annotated"
!!! tip
Prefer to use the Annotated version if possible.
{!> ../../../docs_src/extra_data_types/tutorial001.py!}