如何使 Marshmallow (>=3.0) 将 fields.Dict() 中的数字视为小数

How to make Marshmallow (>=3.0) treat numbers in fields.Dict() as Decimals

我有一个 JSON API,其中一个字段定义为 fields.Dict - 数据可以包含有效的 JSON 并且它的内容留给用户决定。

但是,现在存在一个问题,即用户不能使用小数(需要将它们存储为字符串),因为存储后端 (DynamoDB) 仅支持 Decimal 不支持 float - 并且传递 json.loads(... parse_float=Decimal) 不起作用,因为反序列化是由 Marshmallow 完成的。

我如何强制棉花糖(递归地)将 fields.Dict 中所有带有 . 的数字视为 Decimal 或强制棉花糖始终传递 parse_float参数到JSON加载?

How can I [...] force marshmallow to always pass the parse_float parameter to JSON load?

您可以指定自定义 render_module

import json

class MyJsonDecimalLoader:
    @staticmethod
    def loads(data):
        return json.loads(data, parse_float=Decimal)

class MySchema(marshmallow.Schema):
    class Meta:
        render_module = MyJsonDecimalLoader

    [...]

我不知道如何使用棉花糖字段做得更好,因为字典值中的数据结构定义松散。