2016-11-11 13 views
2

私のPython marshmallowシリアライザは、私がSQLAlchemyベースのアプリケーションで使用しています。ここでマシュマロ:どうすればこの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の場合、"Hello"の代わりに"Goodbye"を返します。どうやってやるの?

特に、この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からから追加された引数をポップこの方法に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) 
関連する問題