Flask_restplus 递归 json_mapping

Flask_restplus recursive json_mapping

是否可以为使用相同的对象提供递归映射json_mapping?

示例:

person_json_mapping = api.model('Person', {
    'name': fields.String(),
    'date_of_birth': fields.Date(),
    'parents': fields.List(fields.Nested(##person_json_mapping##))
    }

如何在自己内部使用person_json_mapping

有一种使用 flask_restplus 定义递归映射的方法,但限制是您必须假设您的情况需要的最大递归级别。你不会想联系亚当和伊娃吧?

不是直接使用 api.model,而是编写一个递归构建该模型的方法,在每个递归调用中递减一个 iteration_number 参数。

def recursive_person_mapping(iteration_number=10):
    person_json_mapping = {
        'name': fields.String(),
        'date_of_birth': fields.Date()
    }
    if iteration_number:
        person_json_mapping['parents'] = fields.List(fields.Nested(recursive_person_mapping(iteration_number-1)))
    return api.model('Person'+str(iteration_number), person_json_mapping)

然后记得进行函数调用,当用编组器装饰你的方法时,像这样:

@api.marshal_with(recursive_person_mapping())
def get(self):
...

注意圆括号!

还值得注意的是,如果你使用swagger,'Person'+str(iteration_number)是必须的。如果不添加 iteration_number ,您最终会遇到递归限制溢出,从而导致内部服务器错误。除了 swagger 之外,mapper 没有它也能正常工作。

在对最大递归级别做出任意假设之后,在超过递归限制时自动通知管理员可能也是一个好主意。这可能是准备数据的方法的责任,而不是编组器本身的责任。