2016-11-11 5 views
2

Unten ist mein Python marshmallow Serializer, den ich in meiner SQLAlchemy-basierten Anwendung verwende.Marshmallow: Wie kann ich den Konstruktor dieser Python-Klasse überschreiben?

import simplejson 
from marshmallow import Schema 
class MySerializer(Schema): 
    class Meta: 
     json_module = simplejson 
     fields = ('field1', 'field2', 'field3') 

    field3 = fields.Method('get_field3') 

    def get_field3(self, this_obj): 
     return "Hello" 

Hier ist, wie ich nenne diese Serializer:

my_argument = 1 
items=MySerializer(documents=list_of_my_objects, many=True).data 

Nun, ich möchte solche die Serializer ändern, dass es ein zusätzliches Argument (I in my_argument passieren wird), und wenn der Wert, dass Argument ist 1, Rückgabe "Goodbye" anstelle von "Hello". Wie kann ich das machen?

Insbesondere weiß ich nicht, wie ich ein Argument zu diesem marshamallow-Schema übergeben kann, so dass es von innen get_field3 verfügbar ist. Ich weiß, dass ich die __init__() Methode überschreiben muss. Aber ich bin mir nicht sicher, wie es aussehen soll. Ich habe versucht, die folgenden, aber es hat nicht funktioniert:

def __init__(self, documents, many, my_arg): 
    self.my_arg = my_arg 
    super(Schema, self).__init__(documents, many=many) 

def get_field3(self, this_obj): 
    self.my_arg == 1: 
     return "Goodbye" 
    else: 
     return "Hello" 

Dies war der Stack-Trace Ich habe:

my_project/my_models/serializers.pyc in __init__(self, documents, many, my_arg) 
---> 25   super(Schema, self).__init__(documents, many=many) 

my_virtualenv/lib/python2.7/site-packages/marshmallow/schema.pyc in __init__(self, obj, extra, only, exclude, prefix, strict, many, skip_missing, context) 
--> 273    self._update_fields(self.obj, many=many) 

my_virtualenv/lib/python2.7/site-packages/marshmallow/schema.pyc in _update_fields(self, obj, many) 
--> 636   ret = self.__filter_fields(field_names, obj, many=many) 

my_virtualenv/lib/python2.7/site-packages/marshmallow/schema.pyc in __filter_fields(self, field_names, obj, many) 
--> 683       attribute_type = type(obj_dict[key]) 
TypeError: list indices must be integers, not str 

Antwort

1

Pop Just added arg von kwargs Fehler zu vermeiden (Sie können jeder passieren kwargs zu Verfahren neu definiert auf diese Weise):

class MySerializer(Schema): 
    # ... 
    def __init__(self, *args, **kwargs): 
     self.my_arg = kwargs.pop('my_arg') if 'my_arg' in kwargs else None 
     super(Schema, self).__init__(*args, **kwargs) 

jetzt können Sie benutzerdefinierte kwarg (Stichwort Argument, nicht positions) pass-Objekte zu erstellen:

MySerializer(documents=list_of_my_objects, many=True, my_arg=1) 
Verwandte Themen