Flask restx model вложенный подстановочный знак

Мне было интересно, один ли я борюсь с такой проблемой.

Возьмем, к примеру, dict:

data = {'totalSize': 3000, 'freq': 2400,
        'distribution':
            {'ram1': {'size': 200, 'status': 'OK'},
             'ram2': {'size': 100, 'status': 'OK'}
             }
        }

Обратите внимание, что ram1/2 - это динамические ключи, которые нельзя узнать заранее.

Вопрос, как должна выглядеть моя api.model? У меня есть:

wild = {"*": fields.Wildcard(fields.String())}
hw_memory = api.model('Memory', {
    'totalSize': fields.Integer(description='total memory size in MB',
                                example=1024),
    'freq': fields.Integer(description='Speed of ram in mhz', example=800),
    'distribution': fields.Nested(wild),
})

Он работает, но не проверяет ничего ниже "раздачи", другими словами, работает как подстановочный знак, все, что есть, будет принято. Есть ли способ вложить dicts таким образом, имея динамический ключ с подстановочными знаками?

1 ответ

Решение

Прежде всего, Wildcard Тип поля принимает определение значений dict, а не определение ключей, т.е. fields.Wildcard(fields.String()) проверяет, что значения dict могут быть только строкового типа (в вашем случае вам необходимо предоставить определение распределения).

Вторая ошибка в том, что вы определяете distribution поле как Nested объект вместо использования Wilcard.

Следующий код должен работать для проверки:


DISTRIBUTION_MODEL = NAMESPACE.model("Distribution", dict(
    size=fields.Integer(),
    status=fields.String(),
))

MEMORY_MODEL = NAMESPACE.model("Memory", dict(
    totalSize=fields.Integer(description='total memory size in MB',
                             example=1024),
    freq=fields.Integer(description='Speed of ram in mhz', example=800),
    distribution=fields.Wildcard(fields.Nested(DISTRIBUTION_MODEL))
))

К сожалению, для маршалинга это не работает. Следующий код должен работать для маршалинга, но не для полезной нагрузки ввода:


OUTPUT_MEMORY_MODEL = NAMESPACE.model("OutputMemory", dict(
    totalSize=fields.Integer(description='total memory size in MB',
                             example=1024),
    freq=fields.Integer(description='Speed of ram in mhz', example=800),
    distribution=flask_utils.fields.Nested(
        NAMESPACE.model(
            "distributions", {
                "*": fields.Wildcard(
                    # DISTRIBUTION_MODEL is taken from previous snippet
                    fields.Nested(DISTRIBUTION_MODEL)
                )
            }
        )
    )
))
Другие вопросы по тегам