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 fdf19feff107..98e88259c29c 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 @@ -25,6 +25,8 @@ import org.openapitools.codegen.meta.GeneratorMetadata; import org.openapitools.codegen.meta.Stability; import org.openapitools.codegen.meta.features.*; +import org.openapitools.codegen.model.ModelMap; +import org.openapitools.codegen.model.ModelsMap; import org.openapitools.codegen.utils.ModelUtils; import org.openapitools.codegen.utils.ProcessUtils; import org.slf4j.Logger; @@ -434,6 +436,19 @@ public String modelTestFileFolder() { return outputFolder + File.separatorChar + testFolder; } + @Override + public ModelsMap postProcessModels(ModelsMap objs) { + // Process models to detect PATCH models (models starting with 'Patched') + for (ModelMap mo : objs.getModels()) { + CodegenModel cm = mo.getModel(); + if (cm.getClassname().startsWith("Patched")) { + // Mark as PATCH model for template handling + cm.vendorExtensions.put("isPatchedModel", true); + } + } + return super.postProcessModels(objs); + } + public String packagePath() { return packageName.replace('.', File.separatorChar); } 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 1b9d0f7d3fd8..a5d695dee505 100644 --- a/modules/openapi-generator/src/main/resources/python/model_generic.mustache +++ b/modules/openapi-generator/src/main/resources/python/model_generic.mustache @@ -167,7 +167,12 @@ class {{classname}}({{#parent}}{{{.}}}{{/parent}}{{^parent}}BaseModel{{/parent}} _dict = self.model_dump( by_alias=True, exclude=excluded_fields, + {{#vendorExtensions.isPatchedModel}} + exclude_unset=True, # For PATCH models, exclude unset fields to avoid sending default values + {{/vendorExtensions.isPatchedModel}} + {{^vendorExtensions.isPatchedModel}} exclude_none=True, + {{/vendorExtensions.isPatchedModel}} ) {{#allVars}} {{#isContainer}}