Exigence de
Vous pouvez utiliser le modèle ormar au lieu du modèle pydantique dans les paramètres du corps de la requête fastapi.
Si vous le souhaitez, vous pouvez bien sûr mélanger Ormar.Models avec Pydantic.
Une des tâches les plus courantes dans une requête consiste à exclure certains champs que vous ne souhaitez pas inclure dans la charge envoyée à l'API.
Cela peut être fait de plusieurs façons dans Ormar, vous pouvez donc consulter vos options ci-dessous et choisir celle qui convient le mieux à votre situation.
Exclure des champs dans une demande
Champs optionnels
Notez que chaque champ facultatif n'est pas obligatoire, ce qui signifie que les champs facultatifs peuvent être ignorés à la fois dans la réponse et la demande.
Les champs ne sont pas nécessaires si (tous/plusieurs/tous):
- Le champ est marqué nullable=True
- Le champ a une valeur par défaut ou une fonction fournie, c'est-à-dire default="Test"
- Le champ a la valeur server_default définie
- Field est un champ autoincrement=Trueprimary_key (notez que ormar.Integerprimary_key est autoincrement par défaut)
Exemples:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | |
Dans l'exemple ci-dessus, le champ id (qui est un entier incrémental automatique), le premier_nom (avec nullable=True) et la catégorie (avec une valeur par défaut) sont facultatifs et peuvent être ignorés dans la réponse, et le modèle sera toujours validé.
Si le champ peut être vide, il n'est pas nécessaire de l'inclure dans la charge utile lors de sa création ainsi que dans la réponse, donc selon l'exemple ci-dessus, vous pouvez:
Attention!!! Notez que bien que vous n'ayez pas à passer un champ facultatif, vous pouvez toujours le faire. si quelqu 'un passe une valeur, elle sera utilisée plus tard, à moins que vous ne preniez des mesures pour l'empêcher.
1 2 3 4 | |
Cela signifie que si vous ne passez pas ie first_name dans la requête, il sera correctement validé (car le champ est facultatif) et None sera enregistré dans la base de données.
Générer un modèle pydantique à partir d'un modèle ormar.
Étant donné que la tâche d'exclure des champs est très courante, ormar dispose d'une méthode spéciale pour générer des modèles pydantiques à partir d'un modèle ormar.Models existant sans avoir à ressaisir tous les champs.
Cette méthode est la méthode get_pydantic() disponible pour toutes les classes de modèle.
1 2 3 4 5 6 | |
!!! NOTE Pour voir plus d'exemples et lire plus, visitez la section get_pydantic de la documentation.
Attention La méthode get_pydantic génère tous les modèles de l'arbre de modèles imbriqués selon un algorithme qui permet d'éviter les boucles dans le modèle (même algorithme utilisé dans model_dump(), select_all(), etc.).
1 2 3 | |
Mypy et vérification de type
Notez que l'affectation d'une fonction en tant que type python passe à l'exécution (car non vérifiée), et les vérificateurs de type statique comme mypy se plaignent.
Bien que le résultat d'un appel de fonction soit toujours le même pour un modèle donné, les types créés dynamiquement ne sont pas autorisés.
Vous avez donc deux options:
La première consiste simplement à ajouter # type:ignore pour ignorer la vérification de type.
1 2 3 4 5 | |
Le second est un peu plus hacky, en utilisant la façon dont fastapi extrait les arguments de la fonction.
Vous pouvez remplacer__annotations__entrée pour un paramètre donné.
1 2 3 4 5 6 7 8 | |
Notez que cela conduira mypy à "penser" que l'utilisateur est un modèle ormar, mais comme dans la requête, cela n'a pas d'importance (vous passerez le dict jsonized de toute façon et devrez le convertir avant de l'enregistrer).
Cela devrait toujours fonctionner correctement, car le modèle résultant sera un sous-ensemble de champs, de sorte que tous les champs requis seront validés et que tous les champs inutilisés échoueront à l'exécution.
Modèle cantilever indépendant
La solution finale consiste à créer manuellement des modèles pydantiques distincts. cela fonctionne exactement comme une application fastapi normale, vous pouvez donc utiliser différents modèles de réponse et de demande, etc.
Sample de:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | |