4.9 KiB
Utiliser des dataclasses
FastAPI est construit au‑dessus de Pydantic, et je vous ai montré comment utiliser des modèles Pydantic pour déclarer les requêtes et les réponses.
Mais FastAPI prend aussi en charge l'utilisation de dataclasses de la même manière :
{* ../../docs_src/dataclasses_/tutorial001_py310.py hl[1,6:11,18:19] *}
Cela fonctionne grâce à Pydantic, qui offre une prise en charge interne des dataclasses.
Ainsi, même avec le code ci‑dessus qui n'emploie pas explicitement Pydantic, FastAPI utilise Pydantic pour convertir ces dataclasses standard en la variante de dataclasses de Pydantic.
Et bien sûr, cela prend en charge la même chose :
- validation des données
- sérialisation des données
- documentation des données, etc.
Cela fonctionne de la même manière qu'avec les modèles Pydantic. Et, en réalité, c'est mis en œuvre de la même façon en interne, en utilisant Pydantic.
/// info | Info
Gardez à l'esprit que les dataclasses ne peuvent pas tout ce que peuvent faire les modèles Pydantic.
Vous pourriez donc avoir encore besoin d'utiliser des modèles Pydantic.
Mais si vous avez déjà un ensemble de dataclasses sous la main, c'est une astuce pratique pour les utiliser afin d'alimenter une API Web avec FastAPI. 🤓
///
Utiliser des dataclasses dans response_model
Vous pouvez aussi utiliser dataclasses dans le paramètre response_model :
{* ../../docs_src/dataclasses_/tutorial002_py310.py hl[1,6:12,18] *}
La dataclass sera automatiquement convertie en dataclass Pydantic.
Ainsi, son schéma apparaîtra dans l'interface utilisateur de la documentation de l'API :
Utiliser des dataclasses dans des structures de données imbriquées
Vous pouvez aussi combiner dataclasses avec d'autres annotations de type pour créer des structures de données imbriquées.
Dans certains cas, vous devrez peut‑être encore utiliser la version dataclasses de Pydantic. Par exemple, si vous rencontrez des erreurs avec la documentation d'API générée automatiquement.
Dans ce cas, vous pouvez simplement remplacer les dataclasses standard par pydantic.dataclasses, qui est un remplacement drop‑in :
{* ../../docs_src/dataclasses_/tutorial003_py310.py hl[1,4,7:10,13:16,22:24,27] *}
-
Nous continuons à importer
fielddepuis lesdataclassesstandard. -
pydantic.dataclassesest un remplacement drop‑in pourdataclasses. -
La dataclass
Authorinclut une liste de dataclassesItem. -
La dataclass
Authorest utilisée comme paramètreresponse_model. -
Vous pouvez utiliser d'autres annotations de type standard avec des dataclasses comme corps de la requête.
Dans ce cas, il s'agit d'une liste de dataclasses
Item. -
Ici, nous renvoyons un dictionnaire qui contient
items, qui est une liste de dataclasses.FastAPI est toujours capable de sérialiser les données en JSON.
-
Ici,
response_modelutilise une annotation de type correspondant à une liste de dataclassesAuthor.Là encore, vous pouvez combiner
dataclassesavec des annotations de type standard. -
Notez que cette fonction de chemin d'accès utilise un
defclassique au lieu deasync def.Comme toujours, avec FastAPI vous pouvez combiner
defetasync defselon vos besoins.Si vous avez besoin d'un rappel sur quand utiliser l'un ou l'autre, consultez la section « In a hurry? » dans la documentation à propos de
asyncetawait{.internal-link target=_blank}. -
Cette fonction de chemin d'accès ne renvoie pas des dataclasses (même si elle le pourrait), mais une liste de dictionnaires contenant des données internes.
FastAPI utilisera le paramètre
response_model(qui inclut des dataclasses) pour convertir la réponse.
Vous pouvez combiner dataclasses avec d'autres annotations de type, selon de nombreuses combinaisons, pour former des structures de données complexes.
Reportez‑vous aux annotations dans le code ci‑dessus pour voir plus de détails spécifiques.
En savoir plus
Vous pouvez aussi combiner dataclasses avec d'autres modèles Pydantic, en hériter, les inclure dans vos propres modèles, etc.
Pour en savoir plus, consultez la documentation Pydantic sur les dataclasses.
Version
C'est disponible depuis FastAPI version 0.67.0. 🔖