@@ -247,7 +247,7 @@ def field(self) -> str | None:
247247 return None
248248 return result
249249
250- def __str__ (self ) -> str :
250+ def __str__ (self ) -> str : # noqa: PLR0912
251251 """Generate field() call or default value representation."""
252252 data : dict [str , Any ] = {k : v for k , v in self .extras .items () if k in self ._FIELD_KEYS }
253253 if self .alias :
@@ -284,6 +284,18 @@ def __str__(self) -> str:
284284 else :
285285 data ["default_factory" ] = type (default_value ).__name__
286286
287+ # Handle default_factory for optional nested models
288+ if (
289+ self .use_default_factory_for_optional_nested_models
290+ and not self .required
291+ and (self .default is None or self .default is UNDEFINED )
292+ and "default_factory" not in data
293+ ):
294+ nested_model_name = self ._get_default_factory_for_optional_nested_model ()
295+ if nested_model_name :
296+ data ["default_factory" ] = nested_model_name
297+ data .pop ("default" , None )
298+
287299 if not data :
288300 return ""
289301
@@ -412,6 +424,19 @@ def _get_default_as_struct_model(self) -> str | None:
412424 )
413425 return None
414426
427+ def _get_default_factory_for_optional_nested_model (self ) -> str | None :
428+ """Get default_factory for optional nested Struct model fields.
429+
430+ Returns the class name if the field type references a Struct,
431+ otherwise returns None.
432+ """
433+ for data_type in self .data_type .data_types or (self .data_type ,):
434+ if data_type .is_dict :
435+ continue
436+ if data_type .reference and isinstance (data_type .reference .source , Struct ):
437+ return data_type .alias or data_type .reference .source .class_name
438+ return None
439+
415440
416441class DataTypeManager (_DataTypeManager ):
417442 """Type manager for msgspec Struct models."""
0 commit comments