@@ -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
@@ -2826,11 +2827,24 @@ def __apply_type_overrides(self, models: list[DataModel]) -> None:
28262827 for field in model .fields :
28272828 # Check scoped override first: "ClassName.field_name"
28282829 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 )
2830+ match self ._type_override_imports .get (scoped_key ):
2831+ case Import () as override_import :
2832+ self ._apply_override_to_field (field , override_import )
2833+ case None if self ._model_type_override_imports :
2834+ # Apply model-level overrides to nested types
2835+ self ._apply_override_to_data_type (field .data_type )
2836+ case None :
2837+ pass
2838+ if not self ._model_type_override_imports :
2839+ continue
2840+ base_classes_overridden = False
2841+ for base_class in model .base_classes :
2842+ if self ._apply_override_to_data_type (base_class ):
2843+ base_classes_overridden = True
2844+ for import_ in base_class .all_imports :
2845+ Parser ._append_model_import (model , import_ )
2846+ if base_classes_overridden :
2847+ model .clear_imports_cache ()
28342848
28352849 def _apply_override_to_field (self , field : DataModelFieldBase , override_import : Import ) -> None :
28362850 """Apply override to entire field's data_type."""
@@ -2841,16 +2855,26 @@ def _apply_override_to_field(self, field: DataModelFieldBase, override_import: I
28412855 self .generation_store .detach_data_type_ref (field .data_type )
28422856 self .generation_store .set_nested_data_types (field .data_type , [])
28432857
2844- def _apply_override_to_data_type (self , data_type : DataType ) -> None :
2858+ @staticmethod
2859+ def _append_model_import (model : DataModel , import_ : Import ) -> None :
2860+ """Append an import to a model once."""
2861+ if import_ not in model ._additional_imports : # noqa: SLF001
2862+ model ._additional_imports .append (import_ ) # noqa: SLF001
2863+
2864+ def _apply_override_to_data_type (self , data_type : DataType ) -> bool :
28452865 """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 ]
2866+ overridden = False
2867+ if data_type . reference and ( override_import : = self ._model_type_override_imports . get ( data_type .reference .name )):
28482868 data_type .import_ = override_import
28492869 data_type .alias = override_import .import_
28502870 self .generation_store .detach_data_type_ref (data_type )
2871+ overridden = True
28512872 # Handle nested types (List[CustomType], Optional[CustomType], etc.)
28522873 for nested in data_type .data_types :
2853- self ._apply_override_to_data_type (nested )
2874+ overridden = self ._apply_override_to_data_type (nested ) or overridden
2875+ if data_type .dict_key :
2876+ overridden = self ._apply_override_to_data_type (data_type .dict_key ) or overridden
2877+ return overridden
28542878
28552879 @staticmethod
28562880 def __disable_union_operator_for_forward_ref_parents (data_type : DataType ) -> None :
0 commit comments