Denis Steinman
Denis Steinman

Reputation: 7799

How to prevent Marshmallow from partial dumping?

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

Answers (1)

Denis Steinman
Denis Steinman

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

Related Questions