When working with OpenAPI specifications, datamodel-code-generator provides several options to control how schemas, operations, and special properties are handled. This page explains when and how to use each option.
| Option | Description |
|---|---|
--openapi-scopes |
Select which parts of the spec to generate models from |
--include-path-parameters |
Include path parameters in generated models |
--use-operation-id-as-name |
Name models using operation IDs |
--read-only-write-only-model-type |
Generate separate models for read/write contexts |
--validation |
Enable OpenAPI validation constraints (deprecated) |
Controls which sections of the OpenAPI specification to generate models from.
| Scope | Description |
|---|---|
schemas |
Generate from #/components/schemas (default) |
parameters |
Generate from #/components/parameters |
paths |
Generate from path operation parameters |
datamodel-codegen --input openapi.yaml --output models.pyGenerates models only from #/components/schemas.
datamodel-codegen --input openapi.yaml --output models.py \
--openapi-scopes schemas parametersAlso generates models from #/components/parameters.
datamodel-codegen --input openapi.yaml --output models.py \
--openapi-scopes schemas parameters pathsGenerates models from all sources, including inline path operation parameters.
| Use Case | Recommended Scopes |
|---|---|
| Basic model generation | schemas (default) |
| Reusable parameter types | schemas parameters |
| Complete API coverage | schemas parameters paths |
Includes path parameters as fields in generated models.
paths:
/users/{user_id}/orders/{order_id}:
get:
operationId: getOrder
parameters:
- name: user_id
in: path
schema:
type: string
- name: order_id
in: path
schema:
type: integerclass GetOrderResponse(BaseModel):
# Only response body fields
items: list[Item]
total: floatdatamodel-codegen --input openapi.yaml --output models.py --include-path-parametersclass GetOrderResponse(BaseModel):
user_id: str
order_id: int
items: list[Item]
total: float- Building request validation models that include URL parameters
- Creating unified request/response types for API clients
- Generating models for frameworks that expect all parameters in one object
Uses the operationId from OpenAPI operations to name generated models instead of deriving names from paths.
paths:
/users/{id}:
get:
operationId: getUserById
responses:
'200':
content:
application/json:
schema:
type: object
properties:
id: { type: integer }
name: { type: string }class UsersIdGetResponse(BaseModel): # Derived from path
id: int
name: strdatamodel-codegen --input openapi.yaml --output models.py --use-operation-id-as-nameclass GetUserByIdResponse(BaseModel): # Uses operationId
id: int
name: str- When
operationIdvalues are well-designed and descriptive - For consistency with generated API clients (e.g., OpenAPI Generator)
- When path-derived names are too verbose or unclear
Generates separate model variants for properties marked as readOnly or writeOnly in OpenAPI.
components:
schemas:
User:
type: object
properties:
id:
type: integer
readOnly: true # Only in responses
password:
type: string
writeOnly: true # Only in requests
name:
type: string # In bothclass User(BaseModel):
id: Optional[int] = None # Both included
password: Optional[str] = None
name: Optional[str] = Nonedatamodel-codegen --input openapi.yaml --output models.py \
--read-only-write-only-model-type allclass User(BaseModel):
"""Base model with all fields."""
id: Optional[int] = None
password: Optional[str] = None
name: Optional[str] = None
class UserRead(BaseModel):
"""For responses - excludes writeOnly fields."""
id: Optional[int] = None
name: Optional[str] = None
class UserWrite(BaseModel):
"""For requests - excludes readOnly fields."""
password: Optional[str] = None
name: Optional[str] = None| Value | Description |
|---|---|
all |
Generate both Read and Write variants |
read |
Generate only Read variants |
write |
Generate only Write variants |
- APIs with distinct request/response schemas
- Strict type checking for API clients
- When
readOnly/writeOnlyproperties are heavily used
!!! warning "Deprecated"
Use --field-constraints instead. The --validation option is maintained for backward compatibility.
Enables validation constraints from OpenAPI schemas.
# Deprecated
datamodel-codegen --input openapi.yaml --output models.py --validation
# Recommended
datamodel-codegen --input openapi.yaml --output models.py --field-constraintsSee Field Constraints for details.
For simple APIs where you only need schema models:
datamodel-codegen --input openapi.yaml --output models.pyFor generating complete models for an API client:
datamodel-codegen --input openapi.yaml --output models/ \
--openapi-scopes schemas parameters paths \
--use-operation-id-as-name \
--include-path-parametersFor APIs with distinct input/output shapes:
datamodel-codegen --input openapi.yaml --output models/ \
--read-only-write-only-model-type all \
--field-constraintsFor large APIs with versioned endpoints:
datamodel-codegen --input openapi.yaml --output models/ \
--treat-dot-as-module \
--use-operation-id-as-name \
--all-exports-scope recursive| OpenAPI Version | Support |
|---|---|
| 3.0.x | Full support |
| 3.1.x | Full support |
| 2.0 (Swagger) | Partial support |