@@ -905,18 +905,41 @@ def _base_schema(
905
905
906
906
# Remove `type: ignore` when mypy handles dynamic base classes
907
907
# https://github.com/python/mypy/issues/2813
908
+ fields_not_init = set ()
909
+ for field in dataclasses .fields (clazz ):
910
+ if field .init is False :
911
+ fields_not_init .add (field .name )
912
+ continue
913
+
908
914
class BaseSchema (base_schema or marshmallow .Schema ): # type: ignore
909
915
def load (self , data : Mapping , * , many : Optional [bool ] = None , ** kwargs ):
910
916
all_loaded = super ().load (data , many = many , ** kwargs )
911
917
many = self .many if many is None else bool (many )
912
918
if many :
913
- return [clazz (** loaded ) for loaded in all_loaded ]
919
+ return [
920
+ get_obj_with_init (clazz , fields_not_init , loaded )
921
+ for loaded in all_loaded
922
+ ]
914
923
else :
915
- return clazz ( ** all_loaded )
924
+ return get_obj_with_init ( clazz , fields_not_init , all_loaded )
916
925
917
926
return BaseSchema
918
927
919
928
929
+ def get_obj_with_init (
930
+ clazz : type , fields_not_init : set [str ], all_loaded : dict [str , Any ]
931
+ ):
932
+ if fields_not_init :
933
+ not_in_init = {
934
+ key : all_loaded .pop (key ) for key in fields_not_init if key in all_loaded
935
+ }
936
+ obj = clazz (** all_loaded )
937
+ if fields_not_init :
938
+ for key , value in not_in_init .items ():
939
+ setattr (obj , key , value )
940
+ return obj
941
+
942
+
920
943
def _get_field_default (field : dataclasses .Field ):
921
944
"""
922
945
Return a marshmallow default value given a dataclass default value
0 commit comments