是否可以使用相同的json映射为对象提供递归映射?
例:
如何在自己内部使用person_json_mapping?
最佳答案
有一种使用flask_restplus
定义递归映射的方法,但有一个限制,即您必须假设您的情况所需的最大递归级别。您不想到达亚当和伊娃,对吗?
而不是直接使用api.model
,而是编写一种以递归方式构建模型的方法,在每个递归调用中递减迭代次数。
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):
...
注意圆括号!
还应该注意的是,如果您使用摇摇欲坠,则
'Person'+str(iteration_number)
是必需的。如果不添加迭代次数,您将最终遇到递归限制溢出,从而导致内部服务器错误。在大摇大摆之外,如果没有它,mapper会做的很好。在对最大递归级别进行任意假设之后,当超过递归限制时自动通知管理员情况也是一个好主意。这可能是准备数据的方法的责任,而不是编组器本身的责任。