Flask_restplus递归json_mapping

时间:2017-09-12 08:21:34

标签: python json flask flask-restplus

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

exapmle:

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

1 个答案:

答案 0 :(得分:3)

有一种方法可以使用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)

然后记得在使用marshaller装饰方法时进行函数调用,如下所示:

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

注意圆括号!

值得注意的是,如果你使用招摇,'Person'+str(iteration_number)是强制性的。如果不添加iteration_number,最终会出现递归限制溢出,从而导致内部服务器错误。在招摇之外,没有它,mapper会很好。

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