Skip to content

Commit d27cc40

Browse files
Fix Python PATCH serialization for unset default fields
1 parent 2917ce8 commit d27cc40

2 files changed

Lines changed: 25 additions & 0 deletions

File tree

modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PythonClientCodegen.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@
2525
import org.openapitools.codegen.meta.GeneratorMetadata;
2626
import org.openapitools.codegen.meta.Stability;
2727
import org.openapitools.codegen.meta.features.*;
28+
import org.openapitools.codegen.model.ModelMap;
29+
import org.openapitools.codegen.model.ModelsMap;
2830
import org.openapitools.codegen.utils.ModelUtils;
2931
import org.openapitools.codegen.utils.ProcessUtils;
3032
import org.slf4j.Logger;
@@ -434,6 +436,18 @@ public String modelTestFileFolder() {
434436
return outputFolder + File.separatorChar + testFolder;
435437
}
436438

439+
@Override
440+
public ModelsMap postProcessModels(ModelsMap objs) {
441+
// Process models to detect PATCH models (models starting with 'Patched')
442+
for (ModelMap mo : objs.getModels()) {
443+
CodegenModel cm = mo.getModel();
444+
if (cm.getClassname().startsWith("Patched")) {
445+
cm.vendorExtensions.put("isPatchedModel", true);
446+
}
447+
}
448+
return super.postProcessModels(objs);
449+
}
450+
437451
public String packagePath() {
438452
return packageName.replace('.', File.separatorChar);
439453
}

modules/openapi-generator/src/main/resources/python/model_generic.mustache

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,11 +164,22 @@ class {{classname}}({{#parent}}{{{.}}}{{/parent}}{{^parent}}BaseModel{{/parent}}
164164
{{/isAdditionalPropertiesTrue}}
165165
])
166166

167+
{{#classname}}
168+
{{#isPatchedModel}}
169+
_dict = self.model_dump(
170+
by_alias=True,
171+
exclude=excluded_fields,
172+
exclude_unset=True, # For PATCH models, exclude unset fields to avoid sending default values
173+
)
174+
{{/isPatchedModel}}
175+
{{^isPatchedModel}}
167176
_dict = self.model_dump(
168177
by_alias=True,
169178
exclude=excluded_fields,
170179
exclude_none=True,
171180
)
181+
{{/isPatchedModel}}
182+
{{/classname}}
172183
{{#allVars}}
173184
{{#isContainer}}
174185
{{#isArray}}

0 commit comments

Comments
 (0)