Generates Python data models from various schema formats including OpenAPI, JSON Schema, GraphQL, and raw data
—
Command-line interface for generating Python data models from various schema formats. The datamodel-codegen command provides access to all generation features through command-line arguments.
Primary command-line interface accessed through the datamodel-codegen console script.
def main(args: Sequence[str] | None = None) -> Exit:
"""
Main CLI entry point for datamodel-codegen command.
Parses command-line arguments and calls generate() function with
appropriate parameters. Handles user input validation, error reporting,
and output formatting.
Args:
args: Command-line arguments (uses sys.argv[1:] if None)
Returns:
Exit enum indicating success or failure status
Exit codes:
Exit.OK (0): Successful completion
Exit.ERROR (1): General error (invalid arguments, processing failure, etc.)
Exit.KeyboardInterrupt (2): User interrupted operation
"""class Exit(IntEnum):
"""Exit status codes for CLI operations."""
OK = 0 # Successful completion
ERROR = 1 # General error
KeyboardInterrupt = 2 # User interrupted operationdatamodel-codegen [OPTIONS]--input INPUT_FILE # Input file path or URL
--output OUTPUT_FILE # Output file path# Input/Output Control
--input-file-type TYPE # Input format (auto|openapi|jsonschema|json|yaml|csv|graphql)
--output-model-type TYPE # Output model type (pydantic.BaseModel|pydantic_v2.BaseModel|dataclasses.dataclass|typing.TypedDict|msgspec.Struct)
--encoding ENCODING # File encoding (default: utf-8)
# Code Generation Options
--target-python-version VER # Target Python version (3.9|3.10|3.11|3.12|3.13)
--base-class CLASS # Custom base class
--class-name NAME # Root class name
--field-constraints # Include field validation constraints
--validation # Enable Pydantic validation features
--use-annotated # Use typing.Annotated for annotations
# Field Naming Options
--snake-case-field # Convert field names to snake_case
--original-field-name-delimiter DELIM # Delimiter for original field names
--aliases MAPPING # Custom field name aliases
--capitalise-enum-members # Capitalize enum member names
# Output Formatting
--disable-timestamp # Skip timestamp in file header
--enable-version-header # Include package version in header
--custom-file-header PATH # Path to custom file header
--formatters LIST # Code formatters (black,isort,ruff-check,ruff-format)
--use-double-quotes # Use double quotes in generated code
# Model Behavior
--strip-default-none # Remove None default values
--allow-extra-fields # Allow extra fields in models
--force-optional-for-required-fields # Make all fields optional
--reuse-model # Reuse models with same structure
--use-schema-description # Use schema descriptions in docstrings
--use-field-description # Use field descriptions in field definitions
# Advanced Options
--custom-template-dir DIR # Directory with custom Jinja2 templates
--http-headers HEADERS # Headers for HTTP requests (format: "key:value")
--http-ignore-tls # Ignore TLS verification
--openapi-scopes SCOPES # OpenAPI parsing scopes (schemas,paths,tags,parameters)
--enum-field-as-literal TYPE # Convert enums to literals (all|one)
--strict-types TYPES # Enable strict typing for types (str,bytes,int,float,bool)# Generate Pydantic models from OpenAPI spec
datamodel-codegen --input api.yaml --output models.py
# Generate from JSON Schema
datamodel-codegen --input schema.json --output models.py --input-file-type jsonschema# Generate Pydantic v2 models
datamodel-codegen --input schema.yaml --output models.py --output-model-type pydantic_v2.BaseModel
# Generate dataclasses
datamodel-codegen --input data.json --output models.py --output-model-type dataclasses.dataclass
# Generate TypedDict
datamodel-codegen --input schema.json --output types.py --output-model-type typing.TypedDict# With field constraints and validation
datamodel-codegen \
--input openapi.yaml \
--output models.py \
--field-constraints \
--validation \
--use-schema-description \
--snake-case-field
# With custom formatting and Python version
datamodel-codegen \
--input schema.json \
--output models.py \
--target-python-version 3.11 \
--formatters black,isort,ruff-format \
--use-double-quotes \
--use-annotated# Fetch from URL with authentication
datamodel-codegen \
--input https://api.example.com/schema.yaml \
--output api_models.py \
--http-headers "Authorization:Bearer token123" \
--http-headers "User-Agent:datamodel-codegen"
# With custom query parameters
datamodel-codegen \
--input "https://api.example.com/schema?version=v2" \
--output models.py \
--http-ignore-tls# Generate from OpenAPI with path parameters
datamodel-codegen \
--input openapi.yaml \
--output models.py \
--input-file-type openapi \
--openapi-scopes schemas,paths \
--include-path-parameters \
--use-operation-id-as-name# Generate from GraphQL schema (requires graphql extra)
datamodel-codegen \
--input schema.graphql \
--output models.py \
--input-file-type graphql# Use custom templates and file header
datamodel-codegen \
--input schema.json \
--output models.py \
--custom-template-dir ./templates \
--custom-file-header ./header.txt \
--disable-timestamp# Convert enums to literals
datamodel-codegen \
--input schema.json \
--output models.py \
--enum-field-as-literal all \
--capitalise-enum-members \
--use-one-literal-as-defaultThe CLI provides clear error messages for common issues:
# Invalid input file
$ datamodel-codegen --input nonexistent.yaml --output models.py
Error: File not found
# Unsupported input format
$ datamodel-codegen --input invalid.txt --output models.py
Error: Invalid file format
# Missing required arguments
$ datamodel-codegen --input schema.json
Error: --output is requiredSome CLI behavior can be controlled via environment variables:
# Set default encoding
export DATAMODEL_CODEGEN_ENCODING=utf-8
# Enable debug mode (requires debug extra)
export DATAMODEL_CODEGEN_DEBUG=1generate-models:
datamodel-codegen \
--input schemas/api.yaml \
--output src/models.py \
--output-model-type pydantic_v2.BaseModel \
--field-constraints \
--formatters black,isort# GitHub Actions example
- name: Generate Models
run: |
pip install datamodel-code-generator
datamodel-codegen \
--input ${{ github.workspace }}/schemas/openapi.yaml \
--output ${{ github.workspace }}/src/generated_models.py \
--validation \
--use-schema-description# .pre-commit-config.yaml
repos:
- repo: local
hooks:
- id: generate-models
name: Generate data models
entry: datamodel-codegen
args: [--input, schemas/api.yaml, --output, src/models.py]
files: ^schemas/.*\.(yaml|json)$
language: systemInstall with Tessl CLI
npx tessl i tessl/pypi-datamodel-code-generator