Aller au contenu

Génération de code avec datamodel-code-generator

Le projet datamodel-code-generator est une bibliothèque et un utilitaire de ligne de commande permettant de générer des modèles pydantiques à partir de presque n'importe quelle source de données, notamment:

  • OpenAPI 3 (YAML/JSON)
  • Schéma JSON
  • Données JSON/YAML/CSV (qui seront converties en schéma JSON)
  • Dictionnaire Python (qui sera converti en schéma JSON)
  • Schéma GraphQL

Chaque fois que vous vous retrouvez avec un JSON convertible en données mais sans modèles pydantiques, cet outil vous permettra de générer des hiérarchies de modèles de type sécurisé à la demande.

Installation

pip install datamodel-code-generator

Exemple

Dans ce cas, datamodel-code-generator crée des modèles pydantiques à partir d'un fichier de schéma JSON.

datamodel-codegen  --input person.json --input-file-type jsonschema --output model.py

personne.json:

{
  "$id": "person.json",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "title": "Person",
  "type": "object",
  "properties": {
    "first_name": {
      "type": "string",
      "description": "The person's first name."
    },
    "last_name": {
      "type": "string",
      "description": "The person's last name."
    },
    "age": {
      "description": "Age in years.",
      "type": "integer",
      "minimum": 0
    },
    "pets": {
      "type": "array",
      "items": [
        {
          "$ref": "#/definitions/Pet"
        }
      ]
    },
    "comment": {
      "type": "null"
    }
  },
  "required": [
      "first_name",
      "last_name"
  ],
  "definitions": {
    "Pet": {
      "properties": {
        "name": {
          "type": "string"
        },
        "age": {
          "type": "integer"
        }
      }
    }
  }
}

modèle.py:

# generated by datamodel-codegen:
#   filename:  person.json
#   timestamp: 2020-05-19T15:07:31+00:00
from __future__ import annotations

from typing import Any

from pydantic import BaseModel, Field, conint


class Pet(BaseModel):
    name: str | None = None
    age: int | None = None


class Person(BaseModel):
    first_name: str = Field(..., description="The person's first name.")
    last_name: str = Field(..., description="The person's last name.")
    age: conint(ge=0) | None = Field(None, description='Age in years.')
    pets: list[Pet] | None = None
    comment: Any | None = None

Plus d’informations peuvent être trouvées sur la documentation officielle


本文总阅读量