Skip to content
Draft
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) | 10 | Input/output configuration |
| 🔧 [Typing Customization](typing-customization.md) | 29 | Type annotation and import behavior |
| 🏷️ [Field Customization](field-customization.md) | 24 | Field naming and docstring behavior |
| 🏗️ [Model Customization](model-customization.md) | 39 | Model generation behavior |
| 🏗️ [Model Customization](model-customization.md) | 40 | Model generation behavior |
| 🎨 [Template Customization](template-customization.md) | 21 | Output formatting and custom rendering |
| 📘 [OpenAPI-only Options](openapi-only-options.md) | 7 | OpenAPI-specific features |
| 📋 [GraphQL-only Options](graphql-only-options.md) | 1 | |
Expand Down Expand Up @@ -194,6 +194,7 @@ This documentation is auto-generated from test cases.
- [`--use-decimal-for-multiple-of`](typing-customization.md#use-decimal-for-multiple-of)
- [`--use-default`](model-customization.md#use-default)
- [`--use-default-factory-for-optional-nested-models`](model-customization.md#use-default-factory-for-optional-nested-models)
- [`--use-default-keep-required-non-nullable`](model-customization.md#use-default-keep-required-non-nullable)
- [`--use-default-kwarg`](model-customization.md#use-default-kwarg)
- [`--use-double-quotes`](template-customization.md#use-double-quotes)
- [`--use-enum-values-in-discriminator`](field-customization.md#use-enum-values-in-discriminator)
Expand Down
283 changes: 256 additions & 27 deletions docs/cli-reference/model-customization.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
| [`--union-mode`](#union-mode) | Union mode for combining anyOf/oneOf schemas (smart or left_... |
| [`--use-default`](#use-default) | Use default values from schema in generated models. |
| [`--use-default-factory-for-optional-nested-models`](#use-default-factory-for-optional-nested-models) | Generate default_factory for optional nested model fields. |
| [`--use-default-keep-required-non-nullable`](#use-default-keep-required-non-nullable) | When using default, keep required field non nullable/non-opt... |
| [`--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... |
Expand Down Expand Up @@ -5292,38 +5293,142 @@ with their defaults, making them optional to provide when instantiating the mode

??? example "Examples"

**Input Schema:**
=== "OpenAPI"

```json
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"title": "Use default with const",
"properties": {
"foo": {
"const": "foo"
**Input Schema:**

```yaml
openapi: 3.1.0
info:
title: Data test
description: Data test
components:
schemas:
data:
type: object
required:
- number
properties:
number:
description: Number
default: 1
type: integer
format: int32
minimum: 0
block:
type: object
required:
- data
properties:
data:
$ref: '#/components/schemas/data'
dataOptional:
$ref: '#/components/schemas/data'
```

Comment thread
GuillaumeSmaha marked this conversation as resolved.
**Output:**

=== "Pydantic v2"

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

from __future__ import annotations

from pydantic import BaseModel, Field, conint


class Data(BaseModel):
number: conint(ge=0) = Field(1, description='Number')


class Block(BaseModel):
data: Data
dataOptional: Data | None = None
```

=== "dataclass"

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

from __future__ import annotations

from dataclasses import dataclass


@dataclass
class Data:
number: int = 1


@dataclass
class Block:
data: Data
dataOptional: Data | None = None
```

=== "msgspec"

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

from __future__ import annotations

from typing import Annotated

from msgspec import UNSET, Meta, Struct, UnsetType


class Data(Struct):
number: Annotated[int, Meta(description='Number', ge=0)] = 1


class Block(Struct):
data: Data
dataOptional: Data | UnsetType = UNSET
```

=== "JSON Schema"

**Input Schema:**

```json
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"title": "Use default with const",
"properties": {
"foo": {
"const": "foo"
}
}
}
}
```
```

**Output:**
**Output:**

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

from __future__ import annotations

from typing import Literal

from pydantic import BaseModel


class UseDefaultWithConst(BaseModel):
foo: Literal['foo'] = 'foo'
```
```python
# generated by datamodel-codegen:
# filename: use_default_with_const.json
# timestamp: 2019-07-26T00:00:00+00:00
from __future__ import annotations
from typing import Literal
from pydantic import BaseModel
class UseDefaultWithConst(BaseModel):
foo: Literal['foo'] = 'foo'
```

---

Expand Down Expand Up @@ -5469,6 +5574,130 @@ for optional nested model fields instead of None default:

---

## `--use-default-keep-required-non-nullable` {#use-default-keep-required-non-nullable}

When using default, keep required field non nullable/non-optionaloptional.

The `--use-default-keep-required-non-nullable` flag keeps a required field
as non-nullable/optional:
- Dataclasses: `field: int = 1`
- Pydantic: `field: int = 1`
- msgspec: `field: int = 1`

**Related:** [`--use-default`](model-customization.md#use-default)

!!! tip "Usage"

```bash
datamodel-codegen --input schema.json --use-default --use-default-keep-required-non-nullable # (1)!
```

1. :material-arrow-left: `--use-default-keep-required-non-nullable` - the option documented here

??? example "Examples"

**Input Schema:**

```yaml
openapi: 3.1.0
info:
title: Data test
description: Data test
components:
schemas:
data:
type: object
required:
- number
properties:
number:
description: Number
default: 1
type: integer
format: int32
minimum: 0
block:
type: object
required:
- data
properties:
data:
$ref: '#/components/schemas/data'
dataOptional:
$ref: '#/components/schemas/data'
```

**Output:**

=== "Pydantic v2"

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

from __future__ import annotations

from pydantic import BaseModel, Field, conint


class Data(BaseModel):
number: conint(ge=0) = Field(1, description='Number')


class Block(BaseModel):
data: Data
dataOptional: Data | None = None
```

=== "dataclass"

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

from __future__ import annotations

from dataclasses import dataclass


@dataclass
class Data:
number: int = 1


@dataclass
class Block:
data: Data
dataOptional: Data | None = None
```

=== "msgspec"

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

from __future__ import annotations

from typing import Annotated

from msgspec import UNSET, Meta, Struct, UnsetType


class Data(Struct):
number: Annotated[int, Meta(description='Number', ge=0)] = 1


class Block(Struct):
data: Data
dataOptional: Data | UnsetType = UNSET
```

---

## `--use-default-kwarg` {#use-default-kwarg}

Use default= keyword argument instead of positional argument for fields with defaults.
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 @@ -127,6 +127,7 @@ datamodel-codegen [OPTIONS]
| [`--union-mode`](model-customization.md#union-mode) | Union mode for combining anyOf/oneOf schemas (smart or left_to_right). |
| [`--use-default`](model-customization.md#use-default) | Use default values from schema in generated models. |
| [`--use-default-factory-for-optional-nested-models`](model-customization.md#use-default-factory-for-optional-nested-models) | Generate default_factory for optional nested model fields. |
| [`--use-default-keep-required-non-nullable`](model-customization.md#use-default-keep-required-non-nullable) | When using default, keep required field non nullable/non-optionaloptional. |
| [`--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). |
Expand Down Expand Up @@ -334,6 +335,7 @@ All options sorted alphabetically:
- [`--use-decimal-for-multiple-of`](typing-customization.md#use-decimal-for-multiple-of) - Generate Decimal types for fields with multipleOf constraint...
- [`--use-default`](model-customization.md#use-default) - Use default values from schema in generated models.
- [`--use-default-factory-for-optional-nested-models`](model-customization.md#use-default-factory-for-optional-nested-models) - Generate default_factory for optional nested model fields.
- [`--use-default-keep-required-non-nullable`](model-customization.md#use-default-keep-required-non-nullable) - When using default, keep required field non nullable/non-opt...
- [`--use-default-kwarg`](model-customization.md#use-default-kwarg) - Use default= keyword argument instead of positional argument...
- [`--use-double-quotes`](template-customization.md#use-double-quotes) - Use double quotes for string literals in generated code.
- [`--use-enum-values-in-discriminator`](field-customization.md#use-enum-values-in-discriminator) - Use enum values in discriminator mappings for union types.
Expand Down
Loading