Scroll to navigation

DATAMODEL-CODEGEN(1) User Commands DATAMODEL-CODEGEN(1)

NAME

datamodel-codegen - pydantic code generator from OpenAPI and more

DESCRIPTION

usage:

datamodel-codegen [options]

Generate Python data models from schema definitions or structured data

For detailed usage, see: https://datamodel-code-generator.koxudaxi.dev

OPTIONS

Custom imports for output (delimited list input). For example "datetime.date,datetime.datetime"
Custom decorators for generated model classes (delimited list input). For example "@dataclass_json(letter_case=LetterCase.CAMEL)". The "@" prefix is optional and will be added automatically if missing.
List of modules with custom formatter (delimited list input).
Map external $ref file paths to Python import packages instead of generating duplicate classes. Accepts one or more mappings after a single flag. Format: "path/to/schema.yaml=mypackage.models". When a $ref points to a mapped file, an import statement is generated instead of a class definition.
Formatters for output (default: [black, isort])
Set headers in HTTP requests to the remote host. (example: "Authorization: Basic dXNlcjpwYXNz")
Disable verification of the remote host's TLS certificate
Set query parameters in HTTP requests to the remote host. (example: "ref=branch")
Timeout in seconds for HTTP requests to remote hosts (default: 30)
Input file/directory (default: stdin)
Input file type (default: auto). Use 'jsonschema', 'openapi', or 'graphql' for schema definitions. Use 'json', 'yaml', or 'csv' for raw sample data to infer a schema automatically.
Python import path to a Pydantic v2 model or schema dict (e.g., 'mypackage.module:ClassName' or 'mypackage.schemas:SCHEMA_DICT'). Can be specified multiple times for related models with inheritance. For dict input, --input-file-type is required. Cannot be used with --input or --url.
Strategy for referenced types in --input-model. 'regenerate-all': Regenerate all types. 'reuseforeign': Reuse types from different families (Enum, etc.), regenerate same-family. 'reuse-all': Reuse all referenced types via import. If not specified, defaults to regenerate-all behavior.
Output file (default: stdout)
Output model type (default: pydantic_v2.BaseModel)
Schema version. Valid values depend on input type: JsonSchema: auto, draft-04, draft-06, draft-07, 2019-09, 2020-12. OpenAPI: auto, 3.0, 3.1. (default: auto - detected from $schema or openapi field)
Schema version validation mode. 'lenient': accept all features regardless of version (default). 'strict': warn on features outside declared/detected version.
Input file URL. `--input` is ignored when `--url` is used

Typing customization:

How to map allOf references to class hierarchies. 'ifno-conflict': only create subclasses when parent class has no conflicting property definition. 'always': always create subclasses.
Mode for field merging in allOf schemas. 'constraints': merge only constraints (minItems, maxItems, pattern, etc.) from parent (default). 'all': merge constraints plus annotations (default, examples) from parent. 'none': do not merge any fields from parent properties.
Base Class (default: pydantic.BaseModel)
Model-specific base class mapping (JSON). Example: '{"MyModel": "custom.BaseA", "OtherModel": "custom.BaseB"}'. Priority: base-class-map > customBasePath (in schema) > base-class.
Disable __future__ imports
Parse enum field as literal. all: all enum field type are Literal. one: field type is Literal when an enum has only one possible value. none: always use Enum class (never convert to Literal)
Per-field override for enum/literal generation. Format: JSON object mapping field names to 'literal' or 'enum'. Example: '{"status": "literal", "priority": "enum"}'. Overrides --enum-field-as-literal for matched fields.
Use field constraints and not con* annotations
Ignore enum constraints and use the base type (e.g., str, int) instead of generating Enum classes
Set enum members as default values for enum field
Use strict types
Override default type mappings. Format: "type+format=target" (e.g., "string+binary=string" to map binary format to string type) or "format=target" (e.g., "binary=string"). Can be specified multiple times.
Replace schema model types with custom Python types. Format: JSON object mapping model names to Python import paths. Model-level: '{"CustomType": "my_app.types.MyType"}' replaces all references. Scoped: '{"User.field": "my_app.Type"}' replaces specific field only.
Use typing.Annotated for Field(). Also, `--fieldconstraints` option will be enabled. Will become default for Pydantic v2 in a future version.
Generate TypedDict with PEP 728 closed=True/extra_items for additionalProperties constraints. Use --no-use-closed-typed-dict for type checkers that don't yet support PEP 728 (e.g., mypy).
Use condecimal instead of confloat for float/number fields with multipleOf constraint (Pydantic only). Avoids floating-point precision issues in validation.
Use enum member literals in discriminator fields instead of string literals
Use generic container types for type hinting (typing.Sequence, typing.Mapping). If `--use-standardcollections` option is set, then import from collections.abc instead of typing
Use the Non{Positive,Negative}{FloatInt} types instead of the corresponding con* constrained types.
Use one literal as default value for one literal field
Use type alias format for RootModel (e.g., Foo = RootModel[Bar]) instead of class inheritance (Pydantic v2 only)
Use pydantic.SerializeAsAny for fields with types that have subtypes (Pydantic v2 only)
Use specialized Enum class (StrEnum, IntEnum). Requires --target-python-version 3.11+
Use standard collections for type hinting (list, dict). Default: enabled
Define generic Enum class as subclass with field type when enum has type (int, float, bytes, str)
Generate tuple types for arrays with items array syntax when minItems equals maxItems equals items length
Use TypeAlias instead of root models (experimental)
Use | operator for Union type (PEP 604). Default: enabled
define field type as `set` when the field attribute has `uniqueItems`

Field customization:

Capitalize field names on enum
Set field name when enum value is empty (default: `_`)
Add extra keys to field parameters
Add extra keys with `x-` prefix to field parameters. The extra keys are stripped of the `x-` prefix.
Add all keys to field parameters
Strategy for handling field name and type name collisions (Pydantic v2 only). 'rename-field': rename field with suffix and add alias (default). 'renametype': rename type class with suffix to preserve field name.
Force optional for required fields
Add extra keys from schema extensions (x-* fields) to model_config json_schema_extra
Add extra keys with `x-` prefix to model_config json_schema_extra. The extra keys are stripped of the `x-` prefix.
Do not add a field alias. E.g., if --snake-case-field is used along with a base class, which has an alias_generator
Set delimiter to convert to snake case. This option only can be used with --snake-case-field (default: `_` )
Remove field name prefix if it has a special meaning e.g. underscores
Change camel-case field name to snake-case
Set field name prefix when first character can't be used as Python field name (default: `field`)
Treat default field as a non-nullable field
Strip default None on fields
Union mode for only pydantic v2 field
Set use_attribute_docstrings=True in Pydantic v2 ConfigDict
Use default value even if a field is required
Use default_factory for optional nested model fields instead of None default. E.g., `field: Model | None = Field(default_factory=Model)` instead of `field: Model | None = None`
Use `default=` instead of a positional argument for Fields that have default values.
Use schema description to populate field docstring
Use schema example to populate field docstring
Use Field(frozen=True) for readOnly fields (Pydantic v2).
Use schema description to populate field docstring as inline docstring
Use serialization_alias instead of alias for field aliasing (Pydantic v2 only). This allows setting values using the Pythonic field name while serializing to the original name.

Model customization:

Strategy for name collisions when using --all-exportsscope=recursive. 'error': raise an error (default). 'minimal-prefix': add module prefix only to colliding names. 'full-prefix': add full module path prefix to colliding names.
Generate __all__ in __init__.py with re-exports. 'children': export from direct child modules only. 'recursive': export from all descendant modules.
Deprecated: Allow passing extra fields. This flag is deprecated. Use `--extra-fields=allow` instead.
Allow population by field name
Set class name of root model
Scope for applying --class-name-prefix/--class-namesuffix. 'all': Apply to all classes including enums (default). 'models': Apply only to model classes. 'enums': Apply only to enum classes.
Prefix to add to generated class names (e.g., 'Api' produces 'ApiUser'). Does not apply to root model when --class-name is specified.
Suffix to add to generated class names (e.g., 'Schema' produces 'UserSchema'). Does not apply to root model when --class-name is specified.
When used with --reuse-model, collapse duplicate models by replacing references instead of creating empty inheritance subclasses. This eliminates 'class Foo(Bar): pass' patterns
Models generated with a root-type field will be merged into the models using that root-type model
Strategy for naming when collapsing root models that reference other models. 'child': Keep inner model's name (default). 'parent': Use wrapper's name for inner model. Requires --collapse-root-models to be set.
Custom dataclass arguments as a JSON dictionary, e.g. '{"frozen": true, "kw_only": true}'. Overrides --frozen-dataclasses and similar flags.
Disable appending `Item` suffix to model name in an array
Disable timestamp on file headers
JSON mapping of type to suffix for resolving duplicate name conflicts. Example: '{"model": "Schema"}' changes Address1 to AddressSchema. Keys: 'model' (for classes), 'enum' (for enums), 'default' (fallback). When not specified, uses numeric suffix (Address1, Address2).
Enable command-line options on file headers for reproducibility
Enable faux immutability
Enable package version on file headers
Set the generated models to allow, forbid, or ignore extra fields.
Generate frozen dataclasses (dataclass(frozen=True)). Only applies to dataclass output.
Keep generated models' order
Defined models as keyword only (for example dataclass(kw_only=True)).
Split generated models into separate files. 'single': generate one file per model class.
Strategy for generating unique model names when duplicates occur. 'numbered' (default): Append numeric suffix (Address, Address1, Address2). Simple but names don't indicate context. 'parent-prefixed': Prefix with parent model name using underscore (Company_Address, Company_Employee_Address for nested). Names show hierarchy. 'full-path': Similar to parent-prefixed but joins with CamelCase (CompanyAddress, CompanyEmployeeAddress). More readable for deep nesting. 'primary-first': Keep clean names for primary definitions (in /definitions/ or /components/schemas/), only add suffix to inline/nested duplicates.
Choose Date class between PastDate, FutureDate or date. (Pydantic v2 only) Each output model has its default mapping.
Choose Datetime class between AwareDatetime, NaiveDatetime, PastDatetime, FutureDatetime or datetime. Each output model has its default mapping (for example pydantic: datetime, dataclass: str, ...)
[Deprecated: use --naming-strategy parent-prefixed] Set name of models defined inline from the parent model
Reuse models on the field when a module has the model with the same content
Scope for model reuse deduplication: module (per-file, default) or tree (cross-file with shared module). Only effective when --reuse-model is set.
Name of the shared module for --reuse-scope=tree (default: "shared"). Use this option if your schema has a file named "shared".
Skip generating the model for the root schema element
Target Pydantic version for generated code. '2': Pydantic 2.0+ compatible (default, uses populate_by_name). '2.11': Pydantic 2.11+ (uses validate_by_name).
target python version
Treat dotted schema names as module paths, creating nested directory structures (e.g., 'foo.bar.Model' becomes 'foo/bar.py'). Use --no-treat-dot-as-module to keep dots in names as underscores for single-file output.
import exact types instead of modules, for example: "from .foo import Bar" instead of "from . import foo" with "foo.Bar"
Generate a shared base class with model configuration (e.g., extra='forbid') instead of repeating the configuration in each model. Keeps code DRY.
use pendulum instead of datetime
Use schema description to populate class docstring
Use Python standard library types for string formats (UUID, IPv4Address, etc.) instead of str. Affects dataclass, msgspec, TypedDict output. Pydantic already uses these types by default.
use titles as class names of models

Template customization:

Alias mapping file (JSON) for renaming fields. Format: {'<schema_field>': '<python_name>'} - the schema field name becomes the Pydantic alias. Supports hierarchical formats: Flat: {'id': 'id_'} applies to all occurrences. Scoped: {'User.name': 'user_name'} applies to specific class. Priority: scoped > flat. Multiple aliases (Pydantic v2 only): {'field': ['alt1', 'alt2']} uses AliasChoices for validation. Example: {'User.name': 'user_name', 'id': 'id_'} generates `id_: ... = Field(alias='id')`.
Custom file header
Custom file header file path
A file with kwargs for custom formatters.
Custom template directory
Default value overrides file (JSON). Supports hierarchical formats: Flat: {'field': value} applies to all occurrences. Scoped: {'ClassName.field': value} applies to specific class. Priority: scoped > flat. Note: Scoped keys use the generated class name for JSON Schema/OpenAPI. Required fields remain required unless --use-default is also specified. Example: {'User.status': 'active', 'page': 1, 'limit': 10}
The encoding of input and output (default: utf-8)
Extra template data for output models. Input is supposed to be a json/yaml file. For OpenAPI and Jsonschema the keys are the spec path of the object, or the name of the object if you want to apply the template data to multiple objects with the same name. If you are using another input file type (e.g. GraphQL), the key is the name of the object. The value is a dictionary of the template data to add.
Model generated with double quotes. Single quotes or your black config skip_string_normalization value will be used without this option.
Allow Ruff to move typing-only imports into TYPE_CHECKING blocks. By default this stays enabled, except for multi-module Ruff formatting of modular Pydantic output where referenced models stay imported at runtime. Use --no-use-type-checking-imports to force runtime imports.
Validators configuration file (JSON). Defines field validators for Pydantic v2 models. Keys are model names, values contain validator definitions with field, function, and mode.
Wrap string literal by using black `experimentalstring-processing` option (require black 20.8b0 or later)

OpenAPI-only options:

Include path parameters in generated parameter models in addition to query parameters (Only OpenAPI)
Include only OpenAPI paths matching fnmatch patterns. Use wildcards: '*' matches any chars, '?' matches single char. Example: '/users/*' '/products'. Requires '--openapi-scopes' to include 'paths'.
Scopes of OpenAPI model generation (default: schemas)
Model generation for readOnly/writeOnly fields: 'request-response' = Request/Response models only (no base model), 'all' = Base + Request + Response models.
use operation id of OpenAPI as class names of models
Include HTTP status code in response model names (e.g., ResourceGetResponse200, ResourceGetResponseDefault)
Deprecated: Enable validation (Only OpenAPI). this option is deprecated. it will be removed in future releases

GraphQL-only options:

Exclude __typename field from generated GraphQL models. Useful when using generated models for GraphQL mutations.

General options:

Verify generated files are up-to-date without modifying them. Exits with code 1 if differences found, 0 if up-to-date. Useful for CI to ensure generated code is committed.
show debug message (require "debug". `$ pip install 'datamodel-code-generator[debug]'`)
disable warnings
Generate CLI command from pyproject.toml configuration and exit
Generate a prompt for consulting LLMs about CLI options. Optionally provide your question as an argument. Pipe to CLI tools (e.g., `| claude -p`, `| codex exec`) or copy to clipboard (e.g., `| pbcopy`, `| xclip`) for web LLM chats.
Generate pyproject.toml configuration from the provided CLI arguments and exit
Ignore pyproject.toml configuration
disable colorized output
Use a named profile from pyproject.toml [tool.datamodel-codegen.profiles.<name>]
show version
Watch input file(s) for changes and regenerate output automatically
Debounce delay in seconds for watch mode (default: 0.5)
show this help message and exit

Documentation: https://datamodel-code-generator.koxudaxi.dev GitHub: https://github.com/koxudaxi/datamodel-code-generator

March 2026 datamodel-codegen 0.55.0-1