Как заставить Marshmallow (> = 3.0) обрабатывать числа в полях. Dict () как десятичные дроби - PullRequest
1 голос
/ 10 июня 2019

У меня есть JSON API, одно из полей которого определено как fields.Dict - данные могут содержать действительный JSON, и их содержимое остается на усмотрение пользователя.

Однако теперь существует проблемачто пользователь не может использовать десятичные дроби (нужно хранить их как строки), поскольку серверная часть хранилища (DynamoDB) поддерживает только Decimal, а не float - и передача json.loads(... parse_float=Decimal) не работает, поскольку десериализация выполняется Marshmallow.

Как я могу заставить зефир (рекурсивно) обрабатывать все числа с . в них в fields.Dict как Decimal s или заставить зефир всегда передавать параметр parse_float в загрузку JSON?

1 Ответ

1 голос
/ 11 июня 2019

Как заставить [...] зефир всегда передавать параметр parse_float загрузке JSON?

Вы можете указать пользовательский 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

    [...]

Я не вижу, как сделать лучше, просто используя поля зефира, так как структура данных в значениях dict слабо определена.

...