@@ -1522,6 +1522,9 @@ def __init__( # noqa: PLR0912, PLR0915
15221522 self ._type_override_imports : dict [str , Import ] = {
15231523 key : Import .from_full_path (value ) for key , value in self .type_overrides .items ()
15241524 }
1525+ self ._model_type_override_imports : dict [str , Import ] = {
1526+ key : import_ for key , import_ in self ._type_override_imports .items () if "." not in key
1527+ }
15251528 self .read_only_write_only_model_type : ReadOnlyWriteOnlyModelType | None = config .read_only_write_only_model_type
15261529 self .use_frozen_field : bool = config .use_frozen_field
15271530 self .use_serialization_alias : bool = config .use_serialization_alias
@@ -2805,14 +2808,12 @@ def __remove_overridden_models(self, models: list[DataModel]) -> list[DataModel]
28052808 Only model-level overrides (keys without dots) cause model removal.
28062809 Scoped overrides (ClassName.field) only affect specific fields.
28072810 """
2808- if not self .type_overrides :
2811+ if not self ._model_type_override_imports :
28092812 return models
2810- # Only model-level overrides (no dot) cause model removal
2811- model_level_overrides = {k for k in self .type_overrides if "." not in k }
2812- return [m for m in models if m .class_name not in model_level_overrides ]
2813+ return [m for m in models if m .class_name not in self ._model_type_override_imports ]
28132814
28142815 def __apply_type_overrides (self , models : list [DataModel ]) -> None :
2815- """Replace field type references with custom import types.
2816+ """Replace type references with custom import types.
28162817
28172818 Supports two key formats:
28182819 - Model-level: {"CustomType": "my_app.Type"} - applies to all references
@@ -2823,14 +2824,31 @@ def __apply_type_overrides(self, models: list[DataModel]) -> None:
28232824 if not self ._type_override_imports :
28242825 return
28252826 for model in models :
2827+ fields_overridden = False
28262828 for field in model .fields :
28272829 # Check scoped override first: "ClassName.field_name"
28282830 scoped_key = f"{ model .class_name } .{ field .name } "
2829- if scoped_key in self ._type_override_imports :
2830- self ._apply_override_to_field (field , self ._type_override_imports [scoped_key ])
2831- else :
2832- # Apply model-level overrides to nested types
2833- self ._apply_override_to_data_type (field .data_type )
2831+ match self ._type_override_imports .get (scoped_key ):
2832+ case Import () as override_import :
2833+ self ._apply_override_to_field (field , override_import )
2834+ fields_overridden = True
2835+ case None if self ._model_type_override_imports :
2836+ # Apply model-level overrides to nested types
2837+ fields_overridden = self ._apply_override_to_data_type (field .data_type ) or fields_overridden
2838+ case None :
2839+ pass
2840+ if fields_overridden :
2841+ model .clear_imports_cache ()
2842+ if not self ._model_type_override_imports :
2843+ continue
2844+ base_classes_overridden = False
2845+ for base_class in model .base_classes :
2846+ if self ._apply_override_to_data_type (base_class ):
2847+ base_classes_overridden = True
2848+ for import_ in base_class .all_imports :
2849+ Parser ._append_model_import (model , import_ )
2850+ if base_classes_overridden :
2851+ model .clear_imports_cache ()
28342852
28352853 def _apply_override_to_field (self , field : DataModelFieldBase , override_import : Import ) -> None :
28362854 """Apply override to entire field's data_type."""
@@ -2841,16 +2859,27 @@ def _apply_override_to_field(self, field: DataModelFieldBase, override_import: I
28412859 self .generation_store .detach_data_type_ref (field .data_type )
28422860 self .generation_store .set_nested_data_types (field .data_type , [])
28432861
2844- def _apply_override_to_data_type (self , data_type : DataType ) -> None :
2862+ @staticmethod
2863+ def _append_model_import (model : DataModel , import_ : Import ) -> None :
2864+ """Append an import to a model once."""
2865+ if import_ in model .imports :
2866+ return
2867+ model ._additional_imports .append (import_ ) # noqa: SLF001
2868+
2869+ def _apply_override_to_data_type (self , data_type : DataType ) -> bool :
28452870 """Recursively apply model-level overrides to a DataType."""
2846- if data_type . reference and data_type . reference . name in self . _type_override_imports :
2847- override_import = self ._type_override_imports [ data_type .reference .name ]
2871+ overridden = False
2872+ if data_type . reference and ( override_import : = self ._model_type_override_imports . get ( data_type .reference .name )):
28482873 data_type .import_ = override_import
28492874 data_type .alias = override_import .import_
28502875 self .generation_store .detach_data_type_ref (data_type )
2876+ overridden = True
28512877 # Handle nested types (List[CustomType], Optional[CustomType], etc.)
28522878 for nested in data_type .data_types :
2853- self ._apply_override_to_data_type (nested )
2879+ overridden = self ._apply_override_to_data_type (nested ) or overridden
2880+ if data_type .dict_key :
2881+ overridden = self ._apply_override_to_data_type (data_type .dict_key ) or overridden
2882+ return overridden
28542883
28552884 @staticmethod
28562885 def __disable_union_operator_for_forward_ref_parents (data_type : DataType ) -> None :
0 commit comments