diff --git a/docs/languages/Python.md b/docs/languages/Python.md index 973087bed0..0f2af639e7 100644 --- a/docs/languages/Python.md +++ b/docs/languages/Python.md @@ -17,6 +17,9 @@ There are special use-cases that each language supports; this document pertains In some cases you might want to use [pydantic](https://pypi.org/project/pydantic/) data validation and settings management using Python type hints for the models. Modelina follows Pydantic v2. +There are some limitations to the current implementation: +1. The preset doesn't unwrap properties of type `ConstrainedDictionaryModel` with `serialilzationType = unwrap`, they are simply excluded from the serialization + You can find an example of its use [here](../../examples/generate-python-pydantic-models/index.ts) ## Generate models with JSON Serializer and Deserializer methods diff --git a/src/generators/python/presets/Pydantic.ts b/src/generators/python/presets/Pydantic.ts index ad010ad648..8d52a894c4 100644 --- a/src/generators/python/presets/Pydantic.ts +++ b/src/generators/python/presets/Pydantic.ts @@ -1,4 +1,7 @@ -import { ConstrainedUnionModel } from '../../../models'; +import { + ConstrainedDictionaryModel, + ConstrainedUnionModel +} from '../../../models'; import { PythonOptions } from '../PythonGenerator'; import { ClassPresetType, PythonPreset } from '../PythonPreset'; @@ -38,7 +41,14 @@ const PYTHON_PYDANTIC_CLASS_PRESET: ClassPresetType = { : undefined; const defaultValue = params.property.required ? undefined : 'default=None'; const jsonAlias = `serialization_alias='${params.property.unconstrainedPropertyName}'`; - const fieldTags = [description, defaultValue, jsonAlias].filter( + let exclude = undefined; + if ( + params.property.property instanceof ConstrainedDictionaryModel && + params.property.property.serializationType === 'unwrap' + ) { + exclude = 'exclude=True'; + } + const fieldTags = [description, defaultValue, jsonAlias, exclude].filter( (value) => value ); return `${propertyName}: ${type} = Field(${fieldTags.join(', ')})`; diff --git a/test/generators/python/presets/__snapshots__/Pydantic.spec.ts.snap b/test/generators/python/presets/__snapshots__/Pydantic.spec.ts.snap index f1d296b3ce..e93ea5b2e2 100644 --- a/test/generators/python/presets/__snapshots__/Pydantic.spec.ts.snap +++ b/test/generators/python/presets/__snapshots__/Pydantic.spec.ts.snap @@ -6,7 +6,7 @@ exports[`PYTHON_PYDANTIC_PRESET should render pydantic for class 1`] = ` multi line description''', default=None, serialization_alias='prop') - additionalProperties: Optional[dict[Any, Any]] = Field(default=None, serialization_alias='additionalProperties') + additionalProperties: Optional[dict[Any, Any]] = Field(default=None, serialization_alias='additionalProperties', exclude=True) " `; @@ -14,15 +14,15 @@ exports[`PYTHON_PYDANTIC_PRESET should render union to support Python < 3.10 1`] Array [ "class UnionTest(BaseModel): unionTest: Optional[Union[Union1, Union2]] = Field(default=None, serialization_alias='unionTest') - additionalProperties: Optional[dict[Any, Any]] = Field(default=None, serialization_alias='additionalProperties') + additionalProperties: Optional[dict[Any, Any]] = Field(default=None, serialization_alias='additionalProperties', exclude=True) ", "class Union1(BaseModel): testProp1: Optional[str] = Field(default=None, serialization_alias='testProp1') - additionalProperties: Optional[dict[Any, Any]] = Field(default=None, serialization_alias='additionalProperties') + additionalProperties: Optional[dict[Any, Any]] = Field(default=None, serialization_alias='additionalProperties', exclude=True) ", "class Union2(BaseModel): testProp2: Optional[str] = Field(default=None, serialization_alias='testProp2') - additionalProperties: Optional[dict[Any, Any]] = Field(default=None, serialization_alias='additionalProperties') + additionalProperties: Optional[dict[Any, Any]] = Field(default=None, serialization_alias='additionalProperties', exclude=True) ", ] `;