【问题标题】:How to prevent Marshmallow from partial dumping?如何防止棉花糖部分倾倒?
【发布时间】:2021-07-14 15:06:39
【问题描述】:

我有下一个数据类和架构:

@dataclass
class Period:
    id: int
    year: int
    month: EMonth
    closed_at: Optional[datetime]

PeriodSchema = marshmallow_dataclass.class_schema(Period)

问题是 Marshmallow 默认允许部分转储:

PeriodSchema().dumps(None) # '{"closed_at": null}'

我需要 Marshmallow 转储我的实体或返回{}''null,简而言之是一些默认值。

如何修复默认行为?

【问题讨论】:

    标签: python marshmallow marshmallow-dataclass


    【解决方案1】:

    我认为这不是最好的解决方案,但它对我很有帮助:

    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)
    

    简而言之,我们只是覆盖使用过的方法并检查空字典和字符串。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      • 2017-02-02
      • 2018-09-08
      • 2016-03-15
      • 1970-01-01
      • 2017-05-12
      • 2019-01-29
      相关资源
      最近更新 更多