Reputation: 7799
I have next data class and schema:
@dataclass
class Period:
id: int
year: int
month: EMonth
closed_at: Optional[datetime]
PeriodSchema = marshmallow_dataclass.class_schema(Period)
The problem is Marshmallow allows a partial dumping by default:
PeriodSchema().dumps(None) # '{"closed_at": null}'
I need to the Marshmallow dumped my entity or returned {}
or ''
, or null
, in short a some default value.
How to fix a default behaviour?
Upvotes: 0
Views: 400
Reputation: 7799
I think this is not the best solution but it helped me as a hot fix:
class BaseSchema(Schema):
def dump(self, obj: Any, *, many: Optional[bool] = None):
if obj is None:
return {}
return super().dump(obj, many=many)
def dumps(self, obj: Any, *args, many: Optional[bool] = None, **kwargs):
if obj is None:
return {}
return super().dumps(obj, *args, many=many, **kwargs)
def load(self, data: Union[Mapping[str, Any], Iterable[Mapping[str, Any]]], *, many: Optional[bool] = None,
partial: Optional[Union[bool, types.StrSequenceOrSet]] = None, unknown: Optional[str] = None):
if not data:
return None
return super().load(data, many=many, partial=partial, unknown=unknown)
def loads(self, json_data: str, *, many: Optional[bool] = None,
partial: Optional[Union[bool, types.StrSequenceOrSet]] = None,
unknown: Optional[str] = None, **kwargs):
if not json_data or json_data == '{}':
return None
return super().loads(json_data, many=many, partial=partial, unknown=unknown, **kwargs)
PeriodSchema = marshmallow_dataclass.class_schema(Period, base_schema=BaseSchema)
In short, we just override used methods and check for empty dictionaries and strings.
Upvotes: 0