2016-11-11 22 views
2

下面是我在我的基於SQLAlchemy的應用程序中使用的python marshmallow序列化程序。棉花糖:我如何覆蓋這個python類的構造函數?

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" 

這是我如何把這個串行:

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

現在,我想改變串行這樣的,它需要一個額外的參數(我將傳遞my_argument)以及如果該值參數爲1,則返回"Goodbye"代替"Hello"。我怎樣才能做到這一點?

特別是,我不知道我怎樣才能在論證這個marshamallow架構傳遞,使得它可以從內部get_field3。我知道我需要重寫__init__()方法。但我不確定它應該是什麼樣子。我嘗試以下,但它沒有工作:

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" 

這是堆棧跟蹤我:

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 

回答

1

剛剛流行從kwargs添加ARG以避免任何錯誤(你可以通過任何kwargs來重新定義方法這種方式):

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) 

現在你可以通過自定義kwarg(關鍵字的說法,不是位置)來創建對象:

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