@@ -94,6 +94,7 @@ class ModelCreateUpdateBase(BaseModel, ABC):
9494
9595 model_config = ConfigDict (frozen = False )
9696 _to_proto_helpers : ClassVar [dict [str , MappingHelper ]] = {}
97+ _field_helpers_called : set [str ] = set ()
9798
9899 def __init__ (self , ** data : Any ):
99100 super ().__init__ (** data )
@@ -146,13 +147,19 @@ def _build_proto_and_paths(
146147 if mapping_helper .update_field :
147148 paths .append (mapping_helper .update_field )
148149 elif isinstance (value , dict ):
149- if field_name in self .__class__ ._to_proto_helpers :
150- assert self .__class__ ._to_proto_helpers [field_name ].converter , (
151- f"Expecting to run a coverter given a helper was defined for: { field_name } "
152- )
150+ if (
151+ field_name in self .__class__ ._to_proto_helpers
152+ and not field_name in self ._field_helpers_called
153+ ):
154+ self ._field_helpers_called .add (field_name )
155+ if (
156+ self .__class__ ._to_proto_helpers .get (field_name )
157+ and self .__class__ ._to_proto_helpers [field_name ].converter
158+ ):
159+ value = self .__class__ ._to_proto_helpers [field_name ].converter (value )
153160 sub_paths = self ._build_proto_and_paths (
154161 proto_msg ,
155- {field_name : self . __class__ . _to_proto_helpers [ field_name ]. converter ( value ) }, # type: ignore[misc]
162+ {field_name : value }, # type: ignore[misc]
156163 "" ,
157164 already_setting_path_override = True ,
158165 )
@@ -178,6 +185,7 @@ def _build_proto_and_paths(
178185 assert self .__class__ ._to_proto_helpers [field_name ].converter , (
179186 f"Expecting to run a coverter given a helper was defined for: { field_name } "
180187 )
188+ self ._field_helpers_called .add (field_name )
181189 for item in value :
182190 repeated_field .append (
183191 self .__class__ ._to_proto_helpers [field_name ].converter (** item ) # type: ignore
0 commit comments