diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PythonClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PythonClientCodegen.java index 56e9974788e7..35a82526e220 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PythonClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PythonClientCodegen.java @@ -1269,6 +1269,27 @@ private ModelsMap postProcessModelsMap(ModelsMap objs) { pydanticImports.add("validator"); } else { // typical model codegenProperties = model.vars; + + // if super class + if (model.getDiscriminator() != null && model.getDiscriminator().getMappedModels() != null) { + typingImports.add("Union"); + Set discriminator = model.getDiscriminator().getMappedModels(); + for (CodegenDiscriminator.MappedModel mappedModel : discriminator) { + postponedModelImports.add(mappedModel.getMappingName()); + } + } + } + + if (!model.allOf.isEmpty()) { // allOf + for (CodegenProperty cp : model.allVars) { + if (!cp.isPrimitiveType || cp.isModel) { + if (cp.isArray){ // if array + modelImports.add(cp.items.dataType); + }else{ // if model + modelImports.add(cp.dataType); + } + } + } } // if model_generic.mustache is used and support additionalProperties diff --git a/modules/openapi-generator/src/main/resources/python/model_generic.mustache b/modules/openapi-generator/src/main/resources/python/model_generic.mustache index 07a3f303d4f8..1355ddbf20bb 100644 --- a/modules/openapi-generator/src/main/resources/python/model_generic.mustache +++ b/modules/openapi-generator/src/main/resources/python/model_generic.mustache @@ -2,11 +2,6 @@ from __future__ import annotations import pprint import re # noqa: F401 import json -{{#hasChildren}} -{{#discriminator}} -import {{{modelPackage}}} -{{/discriminator}} -{{/hasChildren}} {{#vendorExtensions.x-py-datetime-imports}}{{#-first}}from datetime import{{/-first}} {{{.}}}{{^-last}},{{/-last}}{{/vendorExtensions.x-py-datetime-imports}} {{#vendorExtensions.x-py-typing-imports}}{{#-first}}from typing import{{/-first}} {{{.}}}{{^-last}},{{/-last}}{{/vendorExtensions.x-py-typing-imports}} @@ -228,7 +223,7 @@ class {{classname}}({{#parent}}{{{.}}}{{/parent}}{{^parent}}BaseModel{{/parent}} # look up the object type based on discriminator mapping object_type = cls.get_discriminator_value(obj) if object_type: - klass = getattr({{modelPackage}}, object_type) + klass = globals()[object_type] return klass.from_dict(obj) else: raise ValueError("{{{classname}}} failed to lookup discriminator value from " + diff --git a/samples/openapi3/client/petstore/python-aiohttp/petstore_api/models/animal.py b/samples/openapi3/client/petstore/python-aiohttp/petstore_api/models/animal.py index 3845df681a83..36ee81b0afc1 100644 --- a/samples/openapi3/client/petstore/python-aiohttp/petstore_api/models/animal.py +++ b/samples/openapi3/client/petstore/python-aiohttp/petstore_api/models/animal.py @@ -16,10 +16,9 @@ import pprint import re # noqa: F401 import json -import petstore_api.models -from typing import Optional +from typing import Optional, Union from pydantic import BaseModel, Field, StrictStr class Animal(BaseModel): @@ -80,11 +79,14 @@ def from_dict(cls, obj: dict) -> Union(Cat, Dog): # look up the object type based on discriminator mapping object_type = cls.get_discriminator_value(obj) if object_type: - klass = getattr(petstore_api.models, object_type) + klass = globals()[object_type] return klass.from_dict(obj) else: raise ValueError("Animal failed to lookup discriminator value from " + json.dumps(obj) + ". Discriminator property name: " + cls.__discriminator_property_name + ", mapping: " + json.dumps(cls.__discriminator_value_class_map)) +from petstore_api.models.cat import Cat +from petstore_api.models.dog import Dog +Animal.update_forward_refs() diff --git a/samples/openapi3/client/petstore/python/petstore_api/models/animal.py b/samples/openapi3/client/petstore/python/petstore_api/models/animal.py index fd2f85ac5100..6852497be43e 100644 --- a/samples/openapi3/client/petstore/python/petstore_api/models/animal.py +++ b/samples/openapi3/client/petstore/python/petstore_api/models/animal.py @@ -16,10 +16,9 @@ import pprint import re # noqa: F401 import json -import petstore_api.models -from typing import Any, Dict, Optional +from typing import Any, Dict, Optional, Union from pydantic import BaseModel, Field, StrictStr class Animal(BaseModel): @@ -87,11 +86,14 @@ def from_dict(cls, obj: dict) -> Union(Cat, Dog): # look up the object type based on discriminator mapping object_type = cls.get_discriminator_value(obj) if object_type: - klass = getattr(petstore_api.models, object_type) + klass = globals()[object_type] return klass.from_dict(obj) else: raise ValueError("Animal failed to lookup discriminator value from " + json.dumps(obj) + ". Discriminator property name: " + cls.__discriminator_property_name + ", mapping: " + json.dumps(cls.__discriminator_value_class_map)) +from petstore_api.models.cat import Cat +from petstore_api.models.dog import Dog +Animal.update_forward_refs()