2017-09-12 15 views
0

同じjson_mappingを使ってオブジェクトに再帰的マッピングを提供することはできますか?Flask_restplus recursive 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を使用する方法?

答えて

2

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): 
... 

は丸括弧に注意してください!

スワッガーを使用する場合は、'Person'+str(iteration_number)が必須であることにも注意してください。 iteration_numberを追加しないと、再帰制限のオーバーフローが発生し、内部サーバーエラーが発生します。すごいことの外に、マッパーはそれなしでうまくいくでしょう。

最大レベルの再帰を任意に仮定した後、再帰制限を超過した場合に自動的に管理者に通知することをお勧めします。これは、データを作成するメソッドの責任であり、マーシャル自身ではありません。

関連する問題