2017-09-12 3 views
0

Kann rekursives Mapping für Objekte mit demselben json_mapping bereitgestellt werden?Flask_restplus rekursiv 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##)) 
    } 

wie verwenden innen selbst person_json_mapping?

Antwort

2

Es gibt eine Möglichkeit, rekursives Mapping mit flask_restplus zu definieren, mit der Einschränkung, dass Sie eine Annahme auf der maximalen Rekursionsebene machen müssen, die Ihre Situation erfordert. Du würdest Adam und Eva nicht erreichen wollen, oder?

Anstatt api.model direkt zu verwenden, schreiben Sie eine Methode, die das Modell rekursiv aufbaut und ein iteration_number-Argument in jedem rekursiven Aufruf dekrementiert.

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) 

dann denken Sie daran einen Funktionsaufruf zu machen, wenn Ihre Methode mit einem Einweiser dekorieren, wie folgt aus:

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

Hinweis die runden Klammern!

Es ist auch zu beachten, dass 'Person'+str(iteration_number) obligatorisch ist, wenn Sie swagger verwenden. Ohne das Hinzufügen einer Iterationsnummer erhalten Sie einen Überlauf der Rekursionsgrenze, was zu einem internen Serverfehler führt. Außerhalb von Swagger wird Mapper ohne sie aber gut.

Nach einer willkürlichen Annahme der maximalen Rekursion kann es auch eine gute Idee sein, den Administrator automatisch über eine Situation zu informieren, in der das Rekursionslimit überschritten wurde. Dies könnte eine Aufgabe einer Methode sein, die Daten vorbereitet, und nicht der Marshaller selbst.