Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 10 additions & 10 deletions docs/architecture.md
Original file line number Diff line number Diff line change
Expand Up @@ -154,16 +154,16 @@ classDiagram

| Config model | Field count | Purpose |
| --- | ---: | --- |
| `BaseGenerateConfig` | 138 | Shared generation options. |
| `GenerateConfig` | 153 | Public `generate()` configuration. |
| `ParserConfig` | 134 | Base parser dependency injection and parser options. |
| `JSONSchemaParserConfig` | 136 | JSON Schema parser options. |
| `OpenAPIParserConfig` | 142 | OpenAPI-specific parser options. |
| `AsyncAPIParserConfig` | 143 | AsyncAPI-specific parser options. |
| `XMLSchemaParserConfig` | 137 | XML Schema-specific parser options. |
| `ProtobufParserConfig` | 137 | Protocol Buffers-specific parser options. |
| `AvroParserConfig` | 136 | Avro-specific parser options. |
| `GraphQLParserConfig` | 137 | GraphQL-specific parser options. |
| `BaseGenerateConfig` | 139 | Shared generation options. |
| `GenerateConfig` | 154 | Public `generate()` configuration. |
| `ParserConfig` | 135 | Base parser dependency injection and parser options. |
| `JSONSchemaParserConfig` | 137 | JSON Schema parser options. |
| `OpenAPIParserConfig` | 143 | OpenAPI-specific parser options. |
| `AsyncAPIParserConfig` | 144 | AsyncAPI-specific parser options. |
| `XMLSchemaParserConfig` | 138 | XML Schema-specific parser options. |
| `ProtobufParserConfig` | 138 | Protocol Buffers-specific parser options. |
| `AvroParserConfig` | 137 | Avro-specific parser options. |
| `GraphQLParserConfig` | 138 | GraphQL-specific parser options. |

### Formatter Names

Expand Down
3 changes: 2 additions & 1 deletion docs/cli-reference/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ This documentation is auto-generated from test cases.
| 📁 [Base Options](base-options.md) | 12 | Input/output configuration |
| 🔧 [Typing Customization](typing-customization.md) | 30 | Type annotation and import behavior |
| 🏷️ [Field Customization](field-customization.md) | 27 | Field naming and docstring behavior |
| 🏗️ [Model Customization](model-customization.md) | 43 | Model generation behavior |
| 🏗️ [Model Customization](model-customization.md) | 44 | Model generation behavior |
| 🎨 [Template Customization](template-customization.md) | 25 | Output formatting and custom rendering |
| 📘 [OpenAPI-only Options](openapi-only-options.md) | 8 | OpenAPI-specific features |
| 📋 [GraphQL-only Options](graphql-only-options.md) | 1 | |
Expand Down Expand Up @@ -225,6 +225,7 @@ This documentation is auto-generated from test cases.
- [`--use-generic-base-class`](model-customization.md#use-generic-base-class)
- [`--use-generic-container-types`](typing-customization.md#use-generic-container-types)
- [`--use-inline-field-description`](field-customization.md#use-inline-field-description)
- [`--use-missing-sentinel`](model-customization.md#use-missing-sentinel)
- [`--use-non-positive-negative-number-constrained-types`](typing-customization.md#use-non-positive-negative-number-constrained-types)
- [`--use-object-type`](typing-customization.md#use-object-type)
- [`--use-one-literal-as-default`](model-customization.md#use-one-literal-as-default)
Expand Down
83 changes: 83 additions & 0 deletions docs/cli-reference/model-customization.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@
| [`--use-default-kwarg`](#use-default-kwarg) | Use default= keyword argument instead of positional argument... |
| [`--use-frozen-field`](#use-frozen-field) | Generate frozen (immutable) field definitions for readOnly p... |
| [`--use-generic-base-class`](#use-generic-base-class) | Generate a shared base class with model configuration to avo... |
| [`--use-missing-sentinel`](#use-missing-sentinel) | Use Pydantic's MISSING sentinel for optional fields without ... |
| [`--use-one-literal-as-default`](#use-one-literal-as-default) | Use single literal value as default when enum has only one o... |
| [`--use-root-model-sequence-interface`](#use-root-model-sequence-interface) | Make non-null sequence-like Pydantic v2 RootModel classes im... |
| [`--use-serialize-as-any`](#use-serialize-as-any) | Wrap fields with subtypes in Pydantic's SerializeAsAny. |
Expand Down Expand Up @@ -5246,6 +5247,7 @@ The `--target-pydantic-version` flag controls Pydantic version-specific config:

- **2**: Uses `populate_by_name=True` (compatible with Pydantic 2.0-2.10)
- **2.11**: Uses `validate_by_name=True` (for Pydantic 2.11+)
- **2.12**: Uses `validate_by_name=True` and allows features that require Pydantic 2.12+

This prevents breaking changes when generated code is used on older Pydantic versions.

Expand Down Expand Up @@ -6003,6 +6005,87 @@ Generate a shared base class with model configuration to avoid repetition (DRY).

---

## `--use-missing-sentinel` {#use-missing-sentinel}

Use Pydantic's MISSING sentinel for optional fields without defaults.

The `--use-missing-sentinel` flag generates `MISSING` as the default for optional
Pydantic v2 fields that do not define a schema default. This preserves the
difference between an omitted field and a nullable field set to `None`.

**Related:** [`--strict-nullable`](model-customization.md#strict-nullable), [`--target-pydantic-version`](model-customization.md#target-pydantic-version)

!!! tip "Usage"

```bash
datamodel-codegen --input schema.json --output-model-type pydantic_v2.BaseModel --use-missing-sentinel # (1)!
```

1. :material-arrow-left: `--use-missing-sentinel` - the option documented here

??? example "Examples"

**Input Schema:**

```json
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "MissingSentinel",
"type": "object",
"required": ["required", "requiredNullable"],
"properties": {
"required": {
"type": "integer"
},
"requiredNullable": {
"type": ["integer", "null"]
},
"unrequired": {
"type": "integer"
},
"nullableUnrequired": {
"type": ["integer", "null"]
},
"withDefault": {
"type": "integer",
"default": 1
},
"nullDefault": {
"type": ["integer", "null"],
"default": null
},
"aliased-field": {
"type": "string"
}
}
}
```

**Output:**

```python
# generated by datamodel-codegen:
# filename: missing_sentinel.json
# timestamp: 2019-07-26T00:00:00+00:00

from __future__ import annotations

from pydantic import BaseModel, Field
from pydantic.experimental.missing_sentinel import MISSING


class MissingSentinel(BaseModel):
required: int
requiredNullable: int | None
unrequired: int | MISSING = MISSING
nullableUnrequired: int | None | MISSING = MISSING
withDefault: int | None = 1
nullDefault: int | None = None
aliased_field: str | MISSING = Field(MISSING, alias='aliased-field')
```

---

## `--use-one-literal-as-default` {#use-one-literal-as-default}

Use single literal value as default when enum has only one option.
Expand Down
2 changes: 2 additions & 0 deletions docs/cli-reference/quick-reference.md
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,7 @@ datamodel-codegen [OPTIONS]
| [`--use-default-kwarg`](model-customization.md#use-default-kwarg) | Use default= keyword argument instead of positional argument for fields with def... |
| [`--use-frozen-field`](model-customization.md#use-frozen-field) | Generate frozen (immutable) field definitions for readOnly properties. |
| [`--use-generic-base-class`](model-customization.md#use-generic-base-class) | Generate a shared base class with model configuration to avoid repetition (DRY). |
| [`--use-missing-sentinel`](model-customization.md#use-missing-sentinel) | Use Pydantic's MISSING sentinel for optional fields without defaults. |
| [`--use-one-literal-as-default`](model-customization.md#use-one-literal-as-default) | Use single literal value as default when enum has only one option. |
| [`--use-root-model-sequence-interface`](model-customization.md#use-root-model-sequence-interface) | Make non-null sequence-like Pydantic v2 RootModel classes implement collections.... |
| [`--use-serialize-as-any`](model-customization.md#use-serialize-as-any) | Wrap fields with subtypes in Pydantic's SerializeAsAny. |
Expand Down Expand Up @@ -383,6 +384,7 @@ All options sorted alphabetically:
- [`--use-generic-base-class`](model-customization.md#use-generic-base-class) - Generate a shared base class with model configuration to avo...
- [`--use-generic-container-types`](typing-customization.md#use-generic-container-types) - Use generic container types (Sequence, Mapping) for type hin...
- [`--use-inline-field-description`](field-customization.md#use-inline-field-description) - Add field descriptions as inline comments.
- [`--use-missing-sentinel`](model-customization.md#use-missing-sentinel) - Use Pydantic's MISSING sentinel for optional fields without ...
- [`--use-non-positive-negative-number-constrained-types`](typing-customization.md#use-non-positive-negative-number-constrained-types) - Use NonPositive/NonNegative types for number constraints.
- [`--use-object-type`](typing-customization.md#use-object-type) - Use object instead of Any for unspecified object and array v...
- [`--use-one-literal-as-default`](model-customization.md#use-one-literal-as-default) - Use single literal value as default when enum has only one o...
Expand Down
108 changes: 97 additions & 11 deletions docs/llms-full.txt
Original file line number Diff line number Diff line change
Expand Up @@ -1118,7 +1118,7 @@ This documentation is auto-generated from test cases.
| 📁 [Base Options](base-options.md) | 12 | Input/output configuration |
| 🔧 [Typing Customization](typing-customization.md) | 30 | Type annotation and import behavior |
| 🏷️ [Field Customization](field-customization.md) | 27 | Field naming and docstring behavior |
| 🏗️ [Model Customization](model-customization.md) | 43 | Model generation behavior |
| 🏗️ [Model Customization](model-customization.md) | 44 | Model generation behavior |
| 🎨 [Template Customization](template-customization.md) | 25 | Output formatting and custom rendering |
| 📘 [OpenAPI-only Options](openapi-only-options.md) | 8 | OpenAPI-specific features |
| 📋 [GraphQL-only Options](graphql-only-options.md) | 1 | |
Expand Down Expand Up @@ -1332,6 +1332,7 @@ This documentation is auto-generated from test cases.
- [`--use-generic-base-class`](model-customization.md#use-generic-base-class)
- [`--use-generic-container-types`](typing-customization.md#use-generic-container-types)
- [`--use-inline-field-description`](field-customization.md#use-inline-field-description)
- [`--use-missing-sentinel`](model-customization.md#use-missing-sentinel)
- [`--use-non-positive-negative-number-constrained-types`](typing-customization.md#use-non-positive-negative-number-constrained-types)
- [`--use-object-type`](typing-customization.md#use-object-type)
- [`--use-one-literal-as-default`](model-customization.md#use-one-literal-as-default)
Expand Down Expand Up @@ -2382,6 +2383,7 @@ Source: https://datamodel-code-generator.koxudaxi.dev/cli-reference/model-custom
| [`--use-default-kwarg`](#use-default-kwarg) | Use default= keyword argument instead of positional argument... |
| [`--use-frozen-field`](#use-frozen-field) | Generate frozen (immutable) field definitions for readOnly p... |
| [`--use-generic-base-class`](#use-generic-base-class) | Generate a shared base class with model configuration to avo... |
| [`--use-missing-sentinel`](#use-missing-sentinel) | Use Pydantic's MISSING sentinel for optional fields without ... |
| [`--use-one-literal-as-default`](#use-one-literal-as-default) | Use single literal value as default when enum has only one o... |
| [`--use-root-model-sequence-interface`](#use-root-model-sequence-interface) | Make non-null sequence-like Pydantic v2 RootModel classes im... |
| [`--use-serialize-as-any`](#use-serialize-as-any) | Wrap fields with subtypes in Pydantic's SerializeAsAny. |
Expand Down Expand Up @@ -7585,6 +7587,7 @@ The `--target-pydantic-version` flag controls Pydantic version-specific config:

- **2**: Uses `populate_by_name=True` (compatible with Pydantic 2.0-2.10)
- **2.11**: Uses `validate_by_name=True` (for Pydantic 2.11+)
- **2.12**: Uses `validate_by_name=True` and allows features that require Pydantic 2.12+

This prevents breaking changes when generated code is used on older Pydantic versions.

Expand Down Expand Up @@ -8342,6 +8345,87 @@ Generate a shared base class with model configuration to avoid repetition (DRY).

---

## `--use-missing-sentinel` {#use-missing-sentinel}

Use Pydantic's MISSING sentinel for optional fields without defaults.

The `--use-missing-sentinel` flag generates `MISSING` as the default for optional
Pydantic v2 fields that do not define a schema default. This preserves the
difference between an omitted field and a nullable field set to `None`.

**Related:** [`--strict-nullable`](model-customization.md#strict-nullable), [`--target-pydantic-version`](model-customization.md#target-pydantic-version)

!!! tip "Usage"

```bash
datamodel-codegen --input schema.json --output-model-type pydantic_v2.BaseModel --use-missing-sentinel # (1)!
```

1. :material-arrow-left: `--use-missing-sentinel` - the option documented here

??? example "Examples"

**Input Schema:**

```json
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "MissingSentinel",
"type": "object",
"required": ["required", "requiredNullable"],
"properties": {
"required": {
"type": "integer"
},
"requiredNullable": {
"type": ["integer", "null"]
},
"unrequired": {
"type": "integer"
},
"nullableUnrequired": {
"type": ["integer", "null"]
},
"withDefault": {
"type": "integer",
"default": 1
},
"nullDefault": {
"type": ["integer", "null"],
"default": null
},
"aliased-field": {
"type": "string"
}
}
}
```

**Output:**

```python
# generated by datamodel-codegen:
# filename: missing_sentinel.json
# timestamp: 2019-07-26T00:00:00+00:00

from __future__ import annotations

from pydantic import BaseModel, Field
from pydantic.experimental.missing_sentinel import MISSING


class MissingSentinel(BaseModel):
required: int
requiredNullable: int | None
unrequired: int | MISSING = MISSING
nullableUnrequired: int | None | MISSING = MISSING
withDefault: int | None = 1
nullDefault: int | None = None
aliased_field: str | MISSING = Field(MISSING, alias='aliased-field')
```

---

## `--use-one-literal-as-default` {#use-one-literal-as-default}

Use single literal value as default when enum has only one option.
Expand Down Expand Up @@ -27967,6 +28051,7 @@ datamodel-codegen [OPTIONS]
| [`--use-default-kwarg`](model-customization.md#use-default-kwarg) | Use default= keyword argument instead of positional argument for fields with def... |
| [`--use-frozen-field`](model-customization.md#use-frozen-field) | Generate frozen (immutable) field definitions for readOnly properties. |
| [`--use-generic-base-class`](model-customization.md#use-generic-base-class) | Generate a shared base class with model configuration to avoid repetition (DRY). |
| [`--use-missing-sentinel`](model-customization.md#use-missing-sentinel) | Use Pydantic's MISSING sentinel for optional fields without defaults. |
| [`--use-one-literal-as-default`](model-customization.md#use-one-literal-as-default) | Use single literal value as default when enum has only one option. |
| [`--use-root-model-sequence-interface`](model-customization.md#use-root-model-sequence-interface) | Make non-null sequence-like Pydantic v2 RootModel classes implement collections.... |
| [`--use-serialize-as-any`](model-customization.md#use-serialize-as-any) | Wrap fields with subtypes in Pydantic's SerializeAsAny. |
Expand Down Expand Up @@ -28211,6 +28296,7 @@ All options sorted alphabetically:
- [`--use-generic-base-class`](model-customization.md#use-generic-base-class) - Generate a shared base class with model configuration to avo...
- [`--use-generic-container-types`](typing-customization.md#use-generic-container-types) - Use generic container types (Sequence, Mapping) for type hin...
- [`--use-inline-field-description`](field-customization.md#use-inline-field-description) - Add field descriptions as inline comments.
- [`--use-missing-sentinel`](model-customization.md#use-missing-sentinel) - Use Pydantic's MISSING sentinel for optional fields without ...
- [`--use-non-positive-negative-number-constrained-types`](typing-customization.md#use-non-positive-negative-number-constrained-types) - Use NonPositive/NonNegative types for number constraints.
- [`--use-object-type`](typing-customization.md#use-object-type) - Use object instead of Any for unspecified object and array v...
- [`--use-one-literal-as-default`](model-customization.md#use-one-literal-as-default) - Use single literal value as default when enum has only one o...
Expand Down Expand Up @@ -36680,16 +36766,16 @@ classDiagram

| Config model | Field count | Purpose |
| --- | ---: | --- |
| `BaseGenerateConfig` | 138 | Shared generation options. |
| `GenerateConfig` | 153 | Public `generate()` configuration. |
| `ParserConfig` | 134 | Base parser dependency injection and parser options. |
| `JSONSchemaParserConfig` | 136 | JSON Schema parser options. |
| `OpenAPIParserConfig` | 142 | OpenAPI-specific parser options. |
| `AsyncAPIParserConfig` | 143 | AsyncAPI-specific parser options. |
| `XMLSchemaParserConfig` | 137 | XML Schema-specific parser options. |
| `ProtobufParserConfig` | 137 | Protocol Buffers-specific parser options. |
| `AvroParserConfig` | 136 | Avro-specific parser options. |
| `GraphQLParserConfig` | 137 | GraphQL-specific parser options. |
| `BaseGenerateConfig` | 139 | Shared generation options. |
| `GenerateConfig` | 154 | Public `generate()` configuration. |
| `ParserConfig` | 135 | Base parser dependency injection and parser options. |
| `JSONSchemaParserConfig` | 137 | JSON Schema parser options. |
| `OpenAPIParserConfig` | 143 | OpenAPI-specific parser options. |
| `AsyncAPIParserConfig` | 144 | AsyncAPI-specific parser options. |
| `XMLSchemaParserConfig` | 138 | XML Schema-specific parser options. |
| `ProtobufParserConfig` | 138 | Protocol Buffers-specific parser options. |
| `AvroParserConfig` | 137 | Avro-specific parser options. |
| `GraphQLParserConfig` | 138 | GraphQL-specific parser options. |

### Formatter Names

Expand Down
Loading
Loading