@@ -245,7 +245,7 @@ This documentation is auto-generated from test cases.
245245|----------|---------|-------------|
246246| 📁 [Base Options](base-options.md) | 10 | Input/output configuration |
247247| 🔧 [Typing Customization](typing-customization.md) | 29 | Type annotation and import behavior |
248- | 🏷️ [Field Customization](field-customization.md) | 25 | Field naming and docstring behavior |
248+ | 🏷️ [Field Customization](field-customization.md) | 26 | Field naming and docstring behavior |
249249| 🏗️ [Model Customization](model-customization.md) | 39 | Model generation behavior |
250250| 🎨 [Template Customization](template-customization.md) | 21 | Output formatting and custom rendering |
251251| 📘 [OpenAPI-only Options](openapi-only-options.md) | 7 | OpenAPI-specific features |
@@ -403,6 +403,7 @@ This documentation is auto-generated from test cases.
403403
404404- [`--schema-version`](base-options.md#schema-version)
405405- [`--schema-version-mode`](base-options.md#schema-version-mode)
406+ - [`--serialization-aliases`](field-customization.md#serialization-aliases)
406407- [`--set-default-enum-member`](field-customization.md#set-default-enum-member)
407408- [`--shared-module-name`](general-options.md#shared-module-name)
408409- [`--skip-root-model`](model-customization.md#skip-root-model)
@@ -7481,6 +7482,7 @@ Source: https://datamodel-code-generator.koxudaxi.dev/cli-reference/field-custom
74817482| [`--no-alias`](#no-alias) | Disable Field alias generation for non-Python-safe property ... |
74827483| [`--original-field-name-delimiter`](#original-field-name-delimiter) | Specify delimiter for original field names when using snake-... |
74837484| [`--remove-special-field-name-prefix`](#remove-special-field-name-prefix) | Remove the special prefix from field names. |
7485+ | [`--serialization-aliases`](#serialization-aliases) | Apply custom Pydantic v2 serialization aliases from JSON fil... |
74847486| [`--set-default-enum-member`](#set-default-enum-member) | Set the first enum member as the default value for enum fiel... |
74857487| [`--snake-case-field`](#snake-case-field) | Convert field names to snake_case format. |
74867488| [`--special-field-name-prefix`](#special-field-name-prefix) | Prefix to add to special field names (like reserved keywords... |
@@ -9415,6 +9417,306 @@ The `--remove-special-field-name-prefix` flag configures the code generation beh
94159417
94169418---
94179419
9420+ ## `--serialization-aliases` {#serialization-aliases}
9421+
9422+ Apply custom Pydantic v2 serialization aliases from JSON file.
9423+
9424+ The `--serialization-aliases` option lets Pydantic v2 models keep input aliases
9425+ or validation aliases while using separate output-only names for serialization.
9426+
9427+ !!! tip "Usage"
9428+
9429+ ```bash
9430+ datamodel-codegen --input schema.json --aliases aliases/serialization_aliases.json --serialization-aliases aliases/serialization_aliases_output.json --output-model-type pydantic_v2.BaseModel # (1)!
9431+ ```
9432+
9433+ 1. :material-arrow-left: `--serialization-aliases` - the option documented here
9434+
9435+ ??? example "Examples"
9436+
9437+ **Input Schema:**
9438+
9439+ ```json
9440+ {
9441+ "$schema": "http://json-schema.org/draft-07/schema#",
9442+ "title": "Messaging",
9443+ "type": "object",
9444+ "definitions": {
9445+ "SendMessageV2": {
9446+ "type": "object",
9447+ "properties": {
9448+ "textMessage": {
9449+ "type": "string"
9450+ }
9451+ },
9452+ "required": ["textMessage"]
9453+ },
9454+ "OtherMessage": {
9455+ "type": "object",
9456+ "properties": {
9457+ "other-name": {
9458+ "type": "string"
9459+ }
9460+ },
9461+ "required": ["other-name"]
9462+ },
9463+ "SameNameMessage": {
9464+ "type": "object",
9465+ "properties": {
9466+ "same-name": {
9467+ "type": "string"
9468+ }
9469+ },
9470+ "required": ["same-name"]
9471+ },
9472+ "RequiredOnlyMessage": {
9473+ "type": "object",
9474+ "allOf": [
9475+ {
9476+ "type": "object",
9477+ "properties": {
9478+ "known-name": {
9479+ "type": "string"
9480+ }
9481+ },
9482+ "required": [
9483+ "known-name",
9484+ "missing-required",
9485+ "plain-missing",
9486+ "allof-unmapped"
9487+ ]
9488+ }
9489+ ],
9490+ "required": [
9491+ "known-name",
9492+ "missing-required",
9493+ "plain-missing",
9494+ "allof-unmapped"
9495+ ]
9496+ },
9497+ "RequiredOnlyGrandBase": {
9498+ "type": "object",
9499+ "properties": {
9500+ "grand-name": {
9501+ "type": "integer"
9502+ },
9503+ "bare-name": {}
9504+ },
9505+ "required": ["grand-name", "bare-name"]
9506+ },
9507+ "RequiredOnlyBase": {
9508+ "type": "object",
9509+ "properties": {
9510+ "base-name": {
9511+ "type": "string"
9512+ }
9513+ },
9514+ "allOf": [
9515+ {
9516+ "$ref": "#/definitions/RequiredOnlyGrandBase"
9517+ }
9518+ ],
9519+ "required": ["base-name"]
9520+ },
9521+ "RequiredOnlyRefMessage": {
9522+ "type": "object",
9523+ "properties": {
9524+ "own-name": {
9525+ "type": "string"
9526+ }
9527+ },
9528+ "allOf": [
9529+ {
9530+ "$ref": "#/definitions/RequiredOnlyBase"
9531+ }
9532+ ],
9533+ "required": [
9534+ "own-name",
9535+ "grand-name",
9536+ "bare-name",
9537+ "ignored-missing",
9538+ "ref-missing-required",
9539+ "ref-plain-missing"
9540+ ]
9541+ },
9542+ "RequiredOnlyEmptyAllOfBase": {
9543+ "type": "object",
9544+ "allOf": [
9545+ {
9546+ "type": "object"
9547+ }
9548+ ]
9549+ },
9550+ "RequiredOnlyEmptyAllOfMessage": {
9551+ "type": "object",
9552+ "allOf": [
9553+ {
9554+ "$ref": "#/definitions/RequiredOnlyEmptyAllOfBase"
9555+ }
9556+ ],
9557+ "required": ["empty-missing"]
9558+ },
9559+ "RequiredOnlyRecursiveEmptyGrandBase": {
9560+ "type": "object",
9561+ "properties": {
9562+ "unrelated-name": {
9563+ "type": "string"
9564+ }
9565+ }
9566+ },
9567+ "RequiredOnlyRecursiveEmptyBase": {
9568+ "type": "object",
9569+ "allOf": [
9570+ {
9571+ "$ref": "#/definitions/RequiredOnlyRecursiveEmptyGrandBase"
9572+ }
9573+ ]
9574+ },
9575+ "RequiredOnlyRecursiveEmptyMessage": {
9576+ "type": "object",
9577+ "allOf": [
9578+ {
9579+ "$ref": "#/definitions/RequiredOnlyRecursiveEmptyBase"
9580+ }
9581+ ],
9582+ "required": ["recursive-missing"]
9583+ }
9584+ },
9585+ "properties": {
9586+ "send": {
9587+ "$ref": "#/definitions/SendMessageV2"
9588+ },
9589+ "other": {
9590+ "$ref": "#/definitions/OtherMessage"
9591+ },
9592+ "same": {
9593+ "$ref": "#/definitions/SameNameMessage"
9594+ },
9595+ "requiredOnly": {
9596+ "$ref": "#/definitions/RequiredOnlyMessage"
9597+ },
9598+ "requiredOnlyRef": {
9599+ "$ref": "#/definitions/RequiredOnlyRefMessage"
9600+ },
9601+ "requiredOnlyEmptyAllOf": {
9602+ "$ref": "#/definitions/RequiredOnlyEmptyAllOfMessage"
9603+ },
9604+ "requiredOnlyRecursiveEmpty": {
9605+ "$ref": "#/definitions/RequiredOnlyRecursiveEmptyMessage"
9606+ }
9607+ }
9608+ }
9609+ ```
9610+
9611+ **Output:**
9612+
9613+ ```python
9614+ # generated by datamodel-codegen:
9615+ # filename: serialization_aliases.json
9616+ # timestamp: 2019-07-26T00:00:00+00:00
9617+
9618+ from __future__ import annotations
9619+
9620+ from typing import Any
9621+
9622+ from pydantic import AliasChoices, BaseModel, Field
9623+
9624+
9625+ class SendMessageV2(BaseModel):
9626+ message: str = Field(
9627+ ...,
9628+ serialization_alias='messageText',
9629+ validation_alias=AliasChoices('textMessage', 'message', 'text'),
9630+ )
9631+
9632+
9633+ class OtherMessage(BaseModel):
9634+ other_name: str = Field(..., alias='other-name', serialization_alias='otherName')
9635+
9636+
9637+ class SameNameMessage(BaseModel):
9638+ same_name: str = Field(..., alias='same-name', serialization_alias='same_name')
9639+
9640+
9641+ class RequiredOnlyMessage(BaseModel):
9642+ known_name: str = Field(..., alias='known-name')
9643+ missingRequiredInput: Any = Field(
9644+ ...,
9645+ serialization_alias='missingRequired',
9646+ validation_alias=AliasChoices('missing-required', 'missingRequiredInput'),
9647+ )
9648+ plainMissingInput: Any = Field(
9649+ ..., alias='plain-missing', serialization_alias='plainMissing'
9650+ )
9651+ allof_unmapped: Any = Field(..., alias='allof-unmapped')
9652+
9653+
9654+ class RequiredOnlyGrandBase(BaseModel):
9655+ grand_name: int = Field(..., alias='grand-name')
9656+ bare_name: Any = Field(..., alias='bare-name')
9657+
9658+
9659+ class RequiredOnlyBase(RequiredOnlyGrandBase):
9660+ base_name: str = Field(..., alias='base-name')
9661+
9662+
9663+ class RequiredOnlyRefMessage(RequiredOnlyBase):
9664+ own_name: str = Field(..., alias='own-name')
9665+ grand_name: int = Field(
9666+ ...,
9667+ serialization_alias='grandName',
9668+ validation_alias=AliasChoices('grand-name', 'grandInput'),
9669+ )
9670+ bare_name: Any = Field(..., alias='bare-name', serialization_alias='bareName')
9671+ ignored_missing: Any = Field(..., alias='ignored-missing')
9672+ refMissingInput: Any = Field(
9673+ ...,
9674+ serialization_alias='refMissingRequired',
9675+ validation_alias=AliasChoices('ref-missing-required', 'refMissingInput'),
9676+ )
9677+ refPlainMissingInput: Any = Field(
9678+ ..., alias='ref-plain-missing', serialization_alias='refPlainMissing'
9679+ )
9680+
9681+
9682+ class RequiredOnlyEmptyAllOfBase(BaseModel):
9683+ pass
9684+
9685+
9686+ class RequiredOnlyEmptyAllOfMessage(RequiredOnlyEmptyAllOfBase):
9687+ emptyMissingInput: Any = Field(
9688+ ...,
9689+ serialization_alias='emptyMissing',
9690+ validation_alias=AliasChoices('empty-missing', 'emptyMissingInput'),
9691+ )
9692+
9693+
9694+ class RequiredOnlyRecursiveEmptyGrandBase(BaseModel):
9695+ unrelated_name: str | None = Field(None, alias='unrelated-name')
9696+
9697+
9698+ class RequiredOnlyRecursiveEmptyBase(RequiredOnlyRecursiveEmptyGrandBase):
9699+ pass
9700+
9701+
9702+ class RequiredOnlyRecursiveEmptyMessage(RequiredOnlyRecursiveEmptyBase):
9703+ recursiveMissingInput: Any = Field(
9704+ ..., alias='recursive-missing', serialization_alias='recursiveMissing'
9705+ )
9706+
9707+
9708+ class Messaging(BaseModel):
9709+ send: SendMessageV2 | None = None
9710+ other: OtherMessage | None = None
9711+ same: SameNameMessage | None = None
9712+ requiredOnly: RequiredOnlyMessage | None = None
9713+ requiredOnlyRef: RequiredOnlyRefMessage | None = None
9714+ requiredOnlyEmptyAllOf: RequiredOnlyEmptyAllOfMessage | None = None
9715+ requiredOnlyRecursiveEmpty: RequiredOnlyRecursiveEmptyMessage | None = None
9716+ ```
9717+
9718+ ---
9719+
94189720## `--set-default-enum-member` {#set-default-enum-member}
94199721
94209722Set the first enum member as the default value for enum fields.
@@ -24114,6 +24416,7 @@ datamodel-codegen [OPTIONS]
2411424416| [`--no-alias`](field-customization.md#no-alias) | Disable Field alias generation for non-Python-safe property names. |
2411524417| [`--original-field-name-delimiter`](field-customization.md#original-field-name-delimiter) | Specify delimiter for original field names when using snake-case conversion. |
2411624418| [`--remove-special-field-name-prefix`](field-customization.md#remove-special-field-name-prefix) | Remove the special prefix from field names. |
24419+ | [`--serialization-aliases`](field-customization.md#serialization-aliases) | Apply custom Pydantic v2 serialization aliases from JSON file. |
2411724420| [`--set-default-enum-member`](field-customization.md#set-default-enum-member) | Set the first enum member as the default value for enum fields. |
2411824421| [`--snake-case-field`](field-customization.md#snake-case-field) | Convert field names to snake_case format. |
2411924422| [`--special-field-name-prefix`](field-customization.md#special-field-name-prefix) | Prefix to add to special field names (like reserved keywords). |
@@ -24352,6 +24655,7 @@ All options sorted alphabetically:
2435224655- [`--reuse-scope`](model-customization.md#reuse-scope) - Scope for model reuse detection (root or tree).
2435324656- [`--schema-version`](base-options.md#schema-version) - Schema version to use for parsing.
2435424657- [`--schema-version-mode`](base-options.md#schema-version-mode) - Schema version validation mode.
24658+ - [`--serialization-aliases`](field-customization.md#serialization-aliases) - Apply custom Pydantic v2 serialization aliases from JSON fil...
2435524659- [`--set-default-enum-member`](field-customization.md#set-default-enum-member) - Set the first enum member as the default value for enum fiel...
2435624660- [`--shared-module-name`](general-options.md#shared-module-name) - Customize the name of the shared module for deduplicated mod...
2435724661- [`--skip-root-model`](model-customization.md#skip-root-model) - Skip generation of root model when schema contains nested de...
0 commit comments